diff --git a/app/interface/models.py b/app/interface/models.py index 4057bc1..6c53766 100644 --- a/app/interface/models.py +++ b/app/interface/models.py @@ -41,6 +41,19 @@ def rough_date(d): def generate_code(length=9): return "".join([ random.choice('0123456789') for _ in range(length) ]) +class EnsembleQuerySet(models.QuerySet): + + def for_user(self, user, ensemble_keys=[], project_keys=[]): + if user.is_superuser: + return self + + f = models.Q(slug__in=ensemble_keys) | models.Q(projects__in=project_keys) + + if user.is_authenticated: + f |= models.Q(admins=user.pk) + + return self.filter(f).distinct() + class Ensemble(models.Model): ''' A group that plays together @@ -57,12 +70,14 @@ class Ensemble(models.Model): nonce = models.SmallIntegerField(default=1, help_text="Increment this to reset the authentication links") + objects = EnsembleQuerySet.as_manager() + class Meta: ordering = ('slug', ) - def active_projects(self): - #return self.projects.filter(active=True, event_date__gte=timezone.now()) - return self.projects.active().current() + #def active_projects(self): + # #return self.projects.filter(active=True, event_date__gte=timezone.now()) + # return self.projects.active().current() def has_admin(self, user): if not user.is_authenticated: diff --git a/app/interface/views.py b/app/interface/views.py index 0f4a20a..fbfa96d 100644 --- a/app/interface/views.py +++ b/app/interface/views.py @@ -35,7 +35,7 @@ class AuthorizedResourceMixin(object): def is_authorized(self): "By default check if superuser or a signed request" if self.request.is_admin: - logger.debug("is_authorized: superuser") + #logger.debug("is_authorized: superuser") return True if 'sig' in self.request.GET: @@ -51,12 +51,12 @@ class AuthorizedResourceMixin(object): def is_authorized_key(self, resource, key, auth): current = self.get_authorized_keys(resource).get(str(key), None) if current is None: - logger.debug("is_authorized_key: %s %s not in session", resource, key) + #logger.debug("is_authorized_key: %s %s not in session", resource, key) return False if auth == current: return True - logger.info("Authorisation revoked") + #logger.info("Authorisation revoked") self.del_authorized_key(resource, key) return False @@ -196,19 +196,22 @@ class EnsembleListView(AuthorizedResourceMixin, ListView): return True def get_queryset(self): - ensembles = models.Ensemble.objects.all() + return models.Ensemble.objects.for_user(self.request.user, + self.get_authorized_keys('ensemble').keys(), + self.get_authorized_keys('project').keys()) + #ensembles = models.Ensemble.objects.all() - if self.request.is_admin: - return ensembles + #if self.request.is_admin: + # return ensembles # limit to registered ensembles - f = Q(slug__in=self.get_authorized_keys('ensemble').keys()) | Q(projects__in=self.get_authorized_keys('project').keys()) + #f = Q(slug__in=self.get_authorized_keys('ensemble').keys()) | Q(projects__in=self.get_authorized_keys('project').keys()) # or ensembles where the user is admin - if self.request.user.is_authenticated: - f |= Q(admins=self.request.user.pk) + #if self.request.user.is_authenticated: + # f |= Q(admins=self.request.user.pk) - return ensembles.filter(f).distinct() + #return ensembles.filter(f).distinct() class EnsembleDetailView(EnsembleMixin, DetailView): diff --git a/app/library/admin.py b/app/library/admin.py index 3fc3691..cc14770 100644 --- a/app/library/admin.py +++ b/app/library/admin.py @@ -34,7 +34,7 @@ admin.site.register(models.Work, WorkAdmin) class SectionInline(admin.TabularInline): model = models.Section - fields = ['type', 'tag', 'ordinal', 'start', 'end', 'page'] + fields = ['tag', 'start', 'end', 'page'] class DocumentAdmin(admin.ModelAdmin): list_display = ['work', '__str__'] diff --git a/app/library/models.py b/app/library/models.py index 361e878..8c81680 100644 --- a/app/library/models.py +++ b/app/library/models.py @@ -36,8 +36,6 @@ class Orchestration(models.Model): Stores a list of instrument codes as a single entry (space delimited). Can be global or ensemble specific """ - # TODO: change ensemble to collection - #ensemble = models.ForeignKey('interface.Ensemble', on_delete=models.CASCADE, related_name="orchestrations", null=True, blank=True) collection = models.ForeignKey('Collection', on_delete=models.CASCADE, related_name="custom_orchestrations", null=True, blank=True) name = models.CharField(max_length=100) instruments = models.TextField() @@ -234,10 +232,6 @@ class Work(models.Model): def meta(self): return self.meta_info.exclude(name='tag') - @property - def active_projects(self): - return self.projects.filter(active=True) - @property def current_loans(self): return self.project_items.filter(checkout__lte=now(), returned=None).select_related('project') diff --git a/app/library/views/__init__.py b/app/library/views/__init__.py index 7f0895f..cc1bcb1 100644 --- a/app/library/views/__init__.py +++ b/app/library/views/__init__.py @@ -141,7 +141,7 @@ class CollectionListView(ListView): paginate_by = 20 def get_queryset(self): - collections = models.Collection.objects.all() + collections = models.Collection.objects.order_by('name') if self.request.user.is_anonymous: return models.Collection.objects.none() diff --git a/app/library/views/api.py b/app/library/views/api.py index e5d9394..521bb4a 100644 --- a/app/library/views/api.py +++ b/app/library/views/api.py @@ -83,7 +83,7 @@ class SectionSerializer(serializers.ModelSerializer): class DocumentSerializer(serializers.ModelSerializer): - upload = serializers.CharField() + upload = serializers.URLField() sections = SectionSerializer(many=True) #def to_internal_value(self, data):