diff --git a/docs/releases/2.0.rst b/docs/releases/2.0.rst index 99bc3e97d0..02bb436d80 100644 --- a/docs/releases/2.0.rst +++ b/docs/releases/2.0.rst @@ -56,6 +56,8 @@ Add new static media:: Remove unused dependencies:: $ pip uninstall South + $ pip uninstall GitPython + $ pip uninstall psutil The upgrade procedure is now complete. diff --git a/mayan/apps/installation/__init__.py b/mayan/apps/installation/__init__.py index e69de29bb2..8b9f0ee0e0 100644 --- a/mayan/apps/installation/__init__.py +++ b/mayan/apps/installation/__init__.py @@ -0,0 +1 @@ +from .classes import PropertyNamespace # NOQA diff --git a/mayan/apps/installation/apps.py b/mayan/apps/installation/apps.py index ffc9cc6966..aeb8ada778 100644 --- a/mayan/apps/installation/apps.py +++ b/mayan/apps/installation/apps.py @@ -7,7 +7,7 @@ from common.utils import encapsulate from navigation.api import register_links, register_model_list_columns from project_tools.api import register_tool -from .classes import Property, PropertyNamespace +from .classes import Property, PropertyNamespace, PIPNotFound, VirtualEnv from .links import link_menu_link, link_namespace_details, link_namespace_list @@ -41,3 +41,13 @@ class InstallationApp(apps.AppConfig): register_links(PropertyNamespace, [link_namespace_details]) register_links(['installation:namespace_list', PropertyNamespace], [link_namespace_list], menu_name='secondary_menu') register_tool(link_menu_link) + + # Virtualenv + namespace = PropertyNamespace('venv', _('VirtualEnv')) + try: + venv = VirtualEnv() + except PIPNotFound: + namespace.add_property('pip', 'pip', _('pip not found.'), report=True) + else: + for item, version, result in venv.get_results(): + namespace.add_property(item, '%s (%s)' % (item, version), result, report=True) diff --git a/mayan/apps/installation/classes.py b/mayan/apps/installation/classes.py index 5aaab193b5..4206718f4d 100644 --- a/mayan/apps/installation/classes.py +++ b/mayan/apps/installation/classes.py @@ -7,9 +7,10 @@ import sh try: pip = sh.Command('pip') - PIP = True except sh.CommandNotFound: PIP = False +else: + PIP = True class PIPNotFound(Exception): diff --git a/mayan/apps/installation/models.py b/mayan/apps/installation/models.py deleted file mode 100644 index a0d3ce1ce0..0000000000 --- a/mayan/apps/installation/models.py +++ /dev/null @@ -1,154 +0,0 @@ -from __future__ import unicode_literals - -import os -import sys -import platform -import uuid -import time - -from git import Repo -import psutil -import sh - -try: - from sh import lsb_release, uname -except ImportError: - LSB = False -else: - LSB = True - - -from django.db import models -from django.utils.translation import ugettext_lazy as _ -from django.utils.datastructures import SortedDict -from django.conf import settings - -from common.utils import pretty_size -from mayan import __version__ as mayan_version -from ocr.settings import PDFTOTEXT_PATH, TESSERACT_PATH, UNPAPER_PATH - -from .classes import PIPNotFound, PropertyNamespace, VirtualEnv - - -class Installation(object): - _properties = SortedDict() - - uuid = models.CharField(max_length=48, blank=True, default=lambda: unicode(uuid.uuid4())) - - def add_property(self, property_instance): - self._properties[property_instance.name] = property_instance - - def get_properties(self): - self.set_properties() - return self._properties.values() - - def os_properties(self): - namespace = PropertyNamespace('os', _('Operating system')) - if LSB: - namespace.add_property('is_lsb', _('LSB OS'), True, True) - namespace.add_property('distributor_id', _('Distributor ID'), lsb_release('-i', '-s'), True) - namespace.add_property('description', _('Description'), lsb_release('-d', '-s'), True) - namespace.add_property('release', _('Release'), lsb_release('-r', '-s'), True) - namespace.add_property('codename', _('Codename'), lsb_release('-c', '-s'), True) - namespace.add_property('sysinfo', _('System info'), uname('-a'), True) - else: - namespace.add_property('is_lsb', _('LSB OS'), False) - - namespace.add_property('architecture', _('OS architecture'), platform.architecture(), report=True) - namespace.add_property('python_version', _('Python version'), platform.python_version(), report=True) - namespace.add_property('hostname', _('Hostname'), platform.node()) - namespace.add_property('platform', _('Platform'), sys.platform, report=True) - namespace.add_property('machine', _('Machine'), platform.machine(), report=True) - namespace.add_property('processor', _('Processor'), platform.processor(), report=True) - namespace.add_property('cpus', _('Number of CPUs'), psutil.cpu_count(), report=True) - namespace.add_property('total_phymem', _('Total physical memory'), pretty_size(psutil.virtual_memory().total), report=True) - namespace.add_property('disk_partitions', _('Disk partitions'), '; '.join(['%s %s %s %s' % (partition.device, partition.mountpoint, partition.fstype, partition.opts) for partition in psutil.disk_partitions()])) - - def binary_dependencies(self): - namespace = PropertyNamespace('bins', _('Binary dependencies')) - - try: - tesseract = sh.Command(TESSERACT_PATH) - except sh.CommandNotFound: - namespace.add_property('tesseract', _('tesseract version'), _('not found'), report=True) - except Exception: - namespace.add_property('tesseract', _('tesseract version'), _('error getting version'), report=True) - else: - namespace.add_property('tesseract', _('tesseract version'), tesseract('-v').stderr, report=True) - - try: - unpaper = sh.Command(UNPAPER_PATH) - except sh.CommandNotFound: - namespace.add_property('unpaper', _('unpaper version'), _('not found'), report=True) - except Exception: - namespace.add_property('unpaper', _('unpaper version'), _('error getting version'), report=True) - else: - namespace.add_property('unpaper', _('unpaper version'), unpaper('-V').stdout, report=True) - - try: - pdftotext = sh.Command(PDFTOTEXT_PATH) - except sh.CommandNotFound: - namespace.add_property('pdftotext', _('pdftotext version'), _('not found'), report=True) - except Exception: - namespace.add_property('pdftotext', _('pdftotext version'), _('error getting version'), report=True) - else: - namespace.add_property('pdftotext', _('pdftotext version'), pdftotext('-v').stderr, report=True) - - def mayan_properties(self): - namespace = PropertyNamespace('mayan', _('Mayan EDMS')) - - namespace.add_property('uuid', _('UUID'), self.uuid, report=True) - namespace.add_property('mayan_version', _('Mayan EDMS version'), mayan_version, report=True) - - def git_properties(self): - namespace = PropertyNamespace('git', _('Git repository')) - - try: - repo = Repo(os.path.abspath(settings.BASE_DIR)) - except: - namespace.add_property('is_git_repo', _('Running from a Git repository'), False) - else: - try: - repo.config_reader() - headcommit = repo.active_branch.commit - namespace.add_property('is_git_repo', _('Running from a Git repository'), True) - namespace.add_property('repo_remotes', _('Repository remotes'), ', '.join([unicode(remote) for remote in repo.remotes]), report=True) - namespace.add_property('repo_remotes_urls', _('Repository remotes URLs'), ', '.join([unicode(remote.url) for remote in repo.remotes]), report=True) - namespace.add_property('repo_head_reference', _('Branch'), repo.head.reference, report=True) - namespace.add_property('headcommit_hexsha', _('HEAD commit hex SHA'), headcommit.hexsha, report=True) - namespace.add_property('headcommit_author', _('HEAD commit author'), headcommit.author) - namespace.add_property('headcommit_authored_date', _('HEAD commit authored date'), time.asctime(time.gmtime(headcommit.authored_date)), report=True) - namespace.add_property('headcommit_committer', _('HEAD commit committer'), headcommit.committer) - namespace.add_property('headcommit_committed_date', _('HEAD commit committed date'), time.asctime(time.gmtime(headcommit.committed_date)), report=True) - namespace.add_property('headcommit_message', _('HEAD commit message'), headcommit.message, report=True) - except: - # Error getting git information, leave blank - pass - - def virtualenv_properties(self): - namespace = PropertyNamespace('venv', _('VirtualEnv')) - try: - venv = VirtualEnv() - except PIPNotFound: - namespace.add_property('pip', 'pip', _('pip not found.'), report=True) - else: - for item, version, result in venv.get_results(): - namespace.add_property(item, '%s (%s)' % (item, version), result, report=True) - - def set_properties(self): - self._properties = SortedDict() - self.os_properties() - self.binary_dependencies() - self.mayan_properties() - self.git_properties() - self.virtualenv_properties() - - def __getattr__(self, name): - self.set_properties() - try: - return self._properties[name].value - except KeyError: - raise AttributeError - - class Meta: - verbose_name = verbose_name_plural = _('Installation details') diff --git a/mayan/apps/installation/views.py b/mayan/apps/installation/views.py index 8ce851588b..7d277c5f5f 100644 --- a/mayan/apps/installation/views.py +++ b/mayan/apps/installation/views.py @@ -8,14 +8,11 @@ from permissions.models import Permission from .classes import PropertyNamespace from .permissions import PERMISSION_INSTALLATION_DETAILS -from .models import Installation def namespace_list(request): Permission.objects.check_permissions(request.user, [PERMISSION_INSTALLATION_DETAILS]) - Installation().get_properties() - return render_to_response('appearance/generic_list.html', { 'object_list': PropertyNamespace.get_all(), 'title': _('Installation property namespaces'), @@ -26,8 +23,6 @@ def namespace_list(request): def namespace_details(request, namespace_id): Permission.objects.check_permissions(request.user, [PERMISSION_INSTALLATION_DETAILS]) - Installation().get_properties() - namespace = PropertyNamespace.get(namespace_id) object_list = namespace.get_properties() title = _('Installation namespace details for: %s') % namespace.label diff --git a/mayan/apps/ocr/apps.py b/mayan/apps/ocr/apps.py index f72d1f9775..42b55db130 100644 --- a/mayan/apps/ocr/apps.py +++ b/mayan/apps/ocr/apps.py @@ -2,6 +2,8 @@ from __future__ import unicode_literals import logging +import sh + from django import apps from django.utils.translation import ugettext_lazy as _ @@ -10,6 +12,7 @@ from common.utils import encapsulate from documents.models import Document, DocumentVersion from documents.signals import post_version_upload from documents.widgets import document_link +from installation import PropertyNamespace from main.api import register_maintenance_links from navigation.api import register_links, register_model_list_columns from navigation.links import link_spacer @@ -24,6 +27,7 @@ from .links import ( ) from .models import DocumentVersionOCRError from .permissions import PERMISSION_OCR_DOCUMENT +from .settings import PDFTOTEXT_PATH, TESSERACT_PATH, UNPAPER_PATH from .tasks import task_do_ocr logger = logging.getLogger(__name__) @@ -79,3 +83,32 @@ class OCRApp(apps.AppConfig): 'name': _('Result'), 'attribute': 'result' }, ]) + + namespace = PropertyNamespace('ocr', _('OCR')) + + try: + pdftotext = sh.Command(PDFTOTEXT_PATH) + except sh.CommandNotFound: + namespace.add_property('pdftotext', _('pdftotext version'), _('not found'), report=True) + except Exception: + namespace.add_property('pdftotext', _('pdftotext version'), _('error getting version'), report=True) + else: + namespace.add_property('pdftotext', _('pdftotext version'), pdftotext('-v').stderr, report=True) + + try: + tesseract = sh.Command(TESSERACT_PATH) + except sh.CommandNotFound: + namespace.add_property('tesseract', _('tesseract version'), _('not found'), report=True) + except Exception: + namespace.add_property('tesseract', _('tesseract version'), _('error getting version'), report=True) + else: + namespace.add_property('tesseract', _('tesseract version'), tesseract('-v').stderr, report=True) + + try: + unpaper = sh.Command(UNPAPER_PATH) + except sh.CommandNotFound: + namespace.add_property('unpaper', _('unpaper version'), _('not found'), report=True) + except Exception: + namespace.add_property('unpaper', _('unpaper version'), _('error getting version'), report=True) + else: + namespace.add_property('unpaper', _('unpaper version'), unpaper('-V').stdout, report=True) diff --git a/requirements/common.txt b/requirements/common.txt index cb94aa8c0a..213997d114 100644 --- a/requirements/common.txt +++ b/requirements/common.txt @@ -1,7 +1,5 @@ Django==1.7.7 -GitPython==0.3.2.RC1 - Pillow==2.7.0 celery==3.1.17 @@ -23,7 +21,6 @@ django-widget-tweaks==1.3 djangorestframework==2.4.4 pdfminer==20110227 -psutil==2.2.1 pycountry==1.10 pytz==2015.2 python-dateutil==2.4.1