Couple of little fixes

This commit is contained in:
Tris Forster 2023-03-01 12:41:42 +11:00
parent caeee16657
commit f22961ad44
6 changed files with 34 additions and 22 deletions

View File

@ -41,6 +41,19 @@ def rough_date(d):
def generate_code(length=9): def generate_code(length=9):
return "".join([ random.choice('0123456789') for _ in range(length) ]) 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): class Ensemble(models.Model):
''' A group that plays together ''' A group that plays together
@ -57,12 +70,14 @@ class Ensemble(models.Model):
nonce = models.SmallIntegerField(default=1, nonce = models.SmallIntegerField(default=1,
help_text="Increment this to reset the authentication links") help_text="Increment this to reset the authentication links")
objects = EnsembleQuerySet.as_manager()
class Meta: class Meta:
ordering = ('slug', ) ordering = ('slug', )
def active_projects(self): #def active_projects(self):
#return self.projects.filter(active=True, event_date__gte=timezone.now()) # #return self.projects.filter(active=True, event_date__gte=timezone.now())
return self.projects.active().current() # return self.projects.active().current()
def has_admin(self, user): def has_admin(self, user):
if not user.is_authenticated: if not user.is_authenticated:

View File

@ -35,7 +35,7 @@ class AuthorizedResourceMixin(object):
def is_authorized(self): def is_authorized(self):
"By default check if superuser or a signed request" "By default check if superuser or a signed request"
if self.request.is_admin: if self.request.is_admin:
logger.debug("is_authorized: superuser") #logger.debug("is_authorized: superuser")
return True return True
if 'sig' in self.request.GET: if 'sig' in self.request.GET:
@ -51,12 +51,12 @@ class AuthorizedResourceMixin(object):
def is_authorized_key(self, resource, key, auth): def is_authorized_key(self, resource, key, auth):
current = self.get_authorized_keys(resource).get(str(key), None) current = self.get_authorized_keys(resource).get(str(key), None)
if current is 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 return False
if auth == current: if auth == current:
return True return True
logger.info("Authorisation revoked") #logger.info("Authorisation revoked")
self.del_authorized_key(resource, key) self.del_authorized_key(resource, key)
return False return False
@ -196,19 +196,22 @@ class EnsembleListView(AuthorizedResourceMixin, ListView):
return True return True
def get_queryset(self): 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: #if self.request.is_admin:
return ensembles # return ensembles
# limit to registered 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 # or ensembles where the user is admin
if self.request.user.is_authenticated: #if self.request.user.is_authenticated:
f |= Q(admins=self.request.user.pk) # f |= Q(admins=self.request.user.pk)
return ensembles.filter(f).distinct() #return ensembles.filter(f).distinct()
class EnsembleDetailView(EnsembleMixin, DetailView): class EnsembleDetailView(EnsembleMixin, DetailView):

View File

@ -34,7 +34,7 @@ admin.site.register(models.Work, WorkAdmin)
class SectionInline(admin.TabularInline): class SectionInline(admin.TabularInline):
model = models.Section model = models.Section
fields = ['type', 'tag', 'ordinal', 'start', 'end', 'page'] fields = ['tag', 'start', 'end', 'page']
class DocumentAdmin(admin.ModelAdmin): class DocumentAdmin(admin.ModelAdmin):
list_display = ['work', '__str__'] list_display = ['work', '__str__']

View File

@ -36,8 +36,6 @@ class Orchestration(models.Model):
Stores a list of instrument codes as a single entry (space delimited). Stores a list of instrument codes as a single entry (space delimited).
Can be global or ensemble specific 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) collection = models.ForeignKey('Collection', on_delete=models.CASCADE, related_name="custom_orchestrations", null=True, blank=True)
name = models.CharField(max_length=100) name = models.CharField(max_length=100)
instruments = models.TextField() instruments = models.TextField()
@ -234,10 +232,6 @@ class Work(models.Model):
def meta(self): def meta(self):
return self.meta_info.exclude(name='tag') return self.meta_info.exclude(name='tag')
@property
def active_projects(self):
return self.projects.filter(active=True)
@property @property
def current_loans(self): def current_loans(self):
return self.project_items.filter(checkout__lte=now(), returned=None).select_related('project') return self.project_items.filter(checkout__lte=now(), returned=None).select_related('project')

View File

@ -141,7 +141,7 @@ class CollectionListView(ListView):
paginate_by = 20 paginate_by = 20
def get_queryset(self): def get_queryset(self):
collections = models.Collection.objects.all() collections = models.Collection.objects.order_by('name')
if self.request.user.is_anonymous: if self.request.user.is_anonymous:
return models.Collection.objects.none() return models.Collection.objects.none()

View File

@ -83,7 +83,7 @@ class SectionSerializer(serializers.ModelSerializer):
class DocumentSerializer(serializers.ModelSerializer): class DocumentSerializer(serializers.ModelSerializer):
upload = serializers.CharField() upload = serializers.URLField()
sections = SectionSerializer(many=True) sections = SectionSerializer(many=True)
#def to_internal_value(self, data): #def to_internal_value(self, data):