diff options
Diffstat (limited to 'ishtar_common')
| -rw-r--r-- | ishtar_common/context_processors.py | 14 | ||||
| -rw-r--r-- | ishtar_common/management/commands/update_specific_importers.py | 7 | ||||
| -rw-r--r-- | ishtar_common/menu_base.py | 31 | ||||
| -rw-r--r-- | ishtar_common/models.py | 57 | ||||
| -rw-r--r-- | ishtar_common/tests.py | 6 | ||||
| -rw-r--r-- | ishtar_common/views.py | 36 | 
6 files changed, 99 insertions, 52 deletions
diff --git a/ishtar_common/context_processors.py b/ishtar_common/context_processors.py index ce303c344..03ba9bc36 100644 --- a/ishtar_common/context_processors.py +++ b/ishtar_common/context_processors.py @@ -25,18 +25,20 @@ from ishtar_common.utils import shortify  from menus import Menu +from ishtar_common.models import get_current_profile  from archaeological_operations.models import Operation +from archaeological_files.models import File +from archaeological_context_records.models import ContextRecord +from archaeological_finds.models import Find +profile = get_current_profile()  CURRENT_ITEMS = [] -if 'archaeological_files' in settings.INSTALLED_APPS: -    from archaeological_files.models import File +if profile.files:      CURRENT_ITEMS.append((_(u"Archaeological file"), File))  CURRENT_ITEMS.append((_(u"Operation"), Operation)) -if 'archaeological_context_records' in settings.INSTALLED_APPS: -    from archaeological_context_records.models import ContextRecord +if profile.context_record:      CURRENT_ITEMS.append((_(u"Context record"), ContextRecord)) -if 'archaeological_finds' in settings.INSTALLED_APPS: -    from archaeological_finds.models import Find +if profile.find:      CURRENT_ITEMS.append((_(u"Find"), Find)) diff --git a/ishtar_common/management/commands/update_specific_importers.py b/ishtar_common/management/commands/update_specific_importers.py index c5445eb0b..9a13e3f3e 100644 --- a/ishtar_common/management/commands/update_specific_importers.py +++ b/ishtar_common/management/commands/update_specific_importers.py @@ -4,14 +4,11 @@  from optparse import make_option  from django.core.management.base import BaseCommand -from django.conf import settings  IMPORTERS = [] - -if 'archaeological_files' in settings.INSTALLED_APPS: -    from archaeological_files.data_importer import FileImporterSraPdL -    IMPORTERS.append(FileImporterSraPdL) +from archaeological_files.data_importer import FileImporterSraPdL +IMPORTERS.append(FileImporterSraPdL)  class Command(BaseCommand): diff --git a/ishtar_common/menu_base.py b/ishtar_common/menu_base.py index ab0a43d41..eb08d8c78 100644 --- a/ishtar_common/menu_base.py +++ b/ishtar_common/menu_base.py @@ -17,16 +17,28 @@  # See the file COPYING for details. +from ishtar_common.models import get_current_profile +  class SectionItem: -    def __init__(self, idx, label, childs=[]): +    def __init__(self, idx, label, childs=[], profile_restriction=None):          self.idx = idx          self.label = label          self.childs = childs          self.available = False          self.items = {} +        self.profile_restriction = profile_restriction + +    def check_profile_restriction(self): +        if self.profile_restriction: +            profile = get_current_profile() +            if not getattr(profile, self.profile_restriction): +                return False +        return True      def can_be_available(self, user, session=None): +        if not self.check_profile_restriction(): +            return False          for child in self.childs:              if child.can_be_available(user, session=session):                  return True @@ -50,14 +62,27 @@ class SectionItem:  class MenuItem: -    def __init__(self, idx, label, model=None, access_controls=[]): +    def __init__(self, idx, label, model=None, access_controls=[], +                 profile_restriction=None):          self.idx = idx          self.label = label          self.model = model          self.access_controls = access_controls          self.available = False +        self.profile_restriction = profile_restriction +        if not self.check_profile_restriction(): +            return False + +    def check_profile_restriction(self): +        if self.profile_restriction: +            profile = get_current_profile() +            if not getattr(profile, self.profile_restriction): +                return False +        return True      def can_be_available(self, user, session=None): +        if not self.check_profile_restriction(): +            return False          if not self.access_controls:              return True          prefix = (self.model._meta.app_label + '.') if self.model else '' @@ -75,6 +100,8 @@ class MenuItem:          return False      def is_available(self, user, obj=None, session=None): +        if not self.check_profile_restriction(): +            return False          if not self.access_controls:              return True          prefix = (self.model._meta.app_label + '.') if self.model else '' diff --git a/ishtar_common/models.py b/ishtar_common/models.py index bcd1881d6..f5c6ed223 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -250,13 +250,16 @@ class OwnPerms:  class Cached(object): +    slug_field = 'txt_idx' +      @classmethod      def get_cache(cls, slug):          cache_key, value = get_cache(cls, slug)          if value:              return value          try: -            obj = cls.objects.get(txt_idx=slug) +            k = {cls.slug_field: slug} +            obj = cls.objects.get(**k)              cache.set(cache_key, obj, settings.CACHE_TIMEOUT)              return obj          except cls.DoesNotExist: @@ -768,6 +771,7 @@ class LightHistorizedItem(BaseHistorizedItem):  class IshtarSiteProfile(models.Model, Cached): +    slug_field = 'slug'      label = models.TextField(_(u"Name"))      slug = models.SlugField(_(u"Slug"), unique=True)      description = models.TextField(_(u"Description"), null=True, blank=True) @@ -817,6 +821,20 @@ class IshtarSiteProfile(models.Model, Cached):          return obj +def get_current_profile(): +    cache_key, value = get_cache(IshtarSiteProfile, 'is-current-profile') +    if value: +        return value +    q = IshtarSiteProfile.objects.filter(active=True) +    if not q.count(): +        obj = IshtarSiteProfile.objects.create( +            label="Default profile", slug='default', active=True) +    else: +        obj = q.all()[0] +    cache.set(cache_key, obj, settings.CACHE_TIMEOUT) +    return obj + +  class GlobalVar(models.Model, Cached):      slug = models.SlugField(_(u"Variable name"), unique=True)      description = models.TextField(_(u"Description of the variable"), @@ -1214,29 +1232,29 @@ class OrganizationType(GeneralType):          verbose_name_plural = _(u"Organization types")          ordering = ('label',) -MODELS = [ -    ('archaeological_operations.models.Operation', _(u"Operation")), -    ('archaeological_operations.models.ArchaeologicalSite', -     _(u"Archaeological site")), -    ('archaeological_operations.models.Parcel', _(u"Parcels")), -    ('archaeological_operations.models.OperationSource', -     _(u"Operation source")), -] -  IMPORTER_CLASSES = {} -if 'archaeological_files' in settings.INSTALLED_APPS: -    MODELS = [('archaeological_files.models.File', _(u"Archaeological files"))]\ -        + MODELS -    IMPORTER_CLASSES.update({ -        'sra-pdl-files': -        'archaeological_files.data_importer.FileImporterSraPdL'}) -if 'archaeological_context_records' in settings.INSTALLED_APPS: +IMPORTER_CLASSES.update({ +    'sra-pdl-files': +    'archaeological_files.data_importer.FileImporterSraPdL'}) + + +def get_importer_models(): +    MODELS = [ +        ('archaeological_operations.models.Operation', _(u"Operation")), +        ('archaeological_operations.models.ArchaeologicalSite', +         _(u"Archaeological site")), +        ('archaeological_operations.models.Parcel', _(u"Parcels")), +        ('archaeological_operations.models.OperationSource', +         _(u"Operation source")), +    ] +    MODELS = [('archaeological_files.models.File', +              _(u"Archaeological files"))] + MODELS      MODELS = [('archaeological_context_records.models.ContextRecord',                _(u"Context records")), ] + MODELS -if 'archaeological_finds' in settings.INSTALLED_APPS:      MODELS = [('archaeological_finds.models.BaseFind',                _(u"Finds")), ] + MODELS +    return MODELS  def get_model_fields(model): @@ -1274,7 +1292,8 @@ class ImporterType(models.Model):      users = models.ManyToManyField('IshtarUser', verbose_name=_(u"Users"),                                     blank=True, null=True)      associated_models = models.CharField(_(u"Associated model"), -                                         max_length=200, choices=MODELS) +                                         max_length=200, +                                         choices=get_importer_models())      is_template = models.BooleanField(_(u"Is template"), default=False)      unicity_keys = models.CharField(_(u"Unicity keys (separator \";\")"),                                      blank=True, null=True, max_length=500) diff --git a/ishtar_common/tests.py b/ishtar_common/tests.py index 4e800b0d5..e2c9b233f 100644 --- a/ishtar_common/tests.py +++ b/ishtar_common/tests.py @@ -182,3 +182,9 @@ class IshtarSiteProfileTest(TestCase):          profile2.warehouse = True          profile2 = profile2.save()          self.assertTrue(profile2.context_record and profile2.find) + +    def testDefaultProfile(self): +        self.assertFalse(models.IshtarSiteProfile.objects.count()) +        profile = models.get_current_profile() +        self.assertTrue(profile) +        self.assertTrue(models.IshtarSiteProfile.objects.count()) diff --git a/ishtar_common/views.py b/ishtar_common/views.py index 6f95e070a..1c944441f 100644 --- a/ishtar_common/views.py +++ b/ishtar_common/views.py @@ -51,7 +51,12 @@ from xhtml2odt import xhtml2odt  from menus import menu +from archaeological_files.models import File +from archaeological_context_records.models import ContextRecord +from archaeological_finds.models import Find +  from archaeological_operations.forms import DashboardForm as DashboardFormOpe +from archaeological_files.forms import DashboardForm as DashboardFormFile  from ishtar_common.forms import FinalForm, FinalDeleteForm  from ishtar_common import forms_common as forms @@ -927,22 +932,20 @@ def dashboard_main(request, dct, obj_id=None, *args, **kwargs):      Main dashboard      """      app_list = [] -    if 'archaeological_files' in settings.INSTALLED_APPS: +    profile = models.get_current_profile() +    if profile.files:          app_list.append((_(u"Archaeological files"), 'files'))      app_list.append((_(u"Operations"), 'operations')) -    if 'archaeological_context_records' in settings.INSTALLED_APPS: +    if profile.context_record:          app_list.append((_(u"Context records"), 'contextrecords')) -    if 'archaeological_finds' in settings.INSTALLED_APPS: +    if profile.find:          app_list.append((_(u"Finds"), 'finds'))      dct = {'app_list': app_list}      return render_to_response('ishtar/dashboards/dashboard_main.html', dct,                                context_instance=RequestContext(request))  DASHBOARD_FORMS = {} -if 'archaeological_files' in settings.INSTALLED_APPS: -    from archaeological_files.forms import DashboardForm as DashboardFormFile -    DASHBOARD_FORMS['files'] = DashboardFormFile - +DASHBOARD_FORMS['files'] = DashboardFormFile  DASHBOARD_FORMS['operations'] = DashboardFormOpe @@ -957,8 +960,8 @@ def dashboard_main_detail(request, item_name):              dct, context_instance=RequestContext(request))      form = None      slicing, date_source, fltr, show_detail = 'year', None, {}, False -    if (item_name == 'files' and -        'archaeological_files' in settings.INSTALLED_APPS) \ +    profile = models.get_current_profile() +    if (item_name == 'files' and profile.files) \              or item_name == 'operations':          slicing = 'month'      if item_name in DASHBOARD_FORMS: @@ -974,32 +977,25 @@ def dashboard_main_detail(request, item_name):          else:              form = DASHBOARD_FORMS[item_name]()      lbl, dashboard = None, None -    if (item_name == 'files' and -        'archaeological_files' in settings.INSTALLED_APPS) \ +    if (item_name == 'files' and profile.files) \              or item_name == 'operations':          dashboard_kwargs = {'slice': slicing, 'fltr': fltr,                              'show_detail': show_detail}          # date_source is only relevant when the form has set one          if date_source:              dashboard_kwargs['date_source'] = date_source -    if item_name == 'files' and \ -            'archaeological_files' in settings.INSTALLED_APPS: -        from archaeological_files.models import File +    if item_name == 'files' and profile.files:          lbl, dashboard = (_(u"Archaeological files"),                            models.Dashboard(File, **dashboard_kwargs))      if item_name == 'operations':          from archaeological_operations.models import Operation          lbl, dashboard = (_(u"Operations"),                            models.Dashboard(Operation, **dashboard_kwargs)) -    if item_name == 'contextrecords' and \ -            'archaeological_context_records' in settings.INSTALLED_APPS: -        from archaeological_context_records.models import ContextRecord +    if item_name == 'contextrecords' and profile.context_record:          lbl, dashboard = (              _(u"Context records"),              models.Dashboard(ContextRecord, slice=slicing, fltr=fltr)) -    if item_name == 'finds' and \ -            'archaeological_finds' in settings.INSTALLED_APPS: -        from archaeological_finds.models import Find +    if item_name == 'finds' and profile.find:          lbl, dashboard = (_(u"Finds"), models.Dashboard(Find,                                                          slice=slicing,                                                          fltr=fltr))  | 
