forked from rc/aircox
add manager for Related class; rename get_on_air as on_air + can retrieve by last logs instead of date
This commit is contained in:
@ -127,7 +127,7 @@ class SoundInfo:
|
||||
if not os.path.exists(path):
|
||||
return
|
||||
|
||||
old = Track.get_for(object = sound)
|
||||
old = Track.objects.get_for(object = sound)
|
||||
if old:
|
||||
return
|
||||
|
||||
|
@ -45,6 +45,29 @@ def date_or_default(date, no_time = False):
|
||||
return date
|
||||
|
||||
|
||||
class RelatedManager(models.Manager):
|
||||
def get_for(self, object = None, model = None):
|
||||
"""
|
||||
Return a queryset that filter on the given object or model(s)
|
||||
|
||||
* object: if given, use its type and pk; match on models only.
|
||||
* model: one model or an iterable of models
|
||||
"""
|
||||
if not model and object:
|
||||
model = type(object)
|
||||
|
||||
if hasattr(model, '__iter__'):
|
||||
model = [ ContentType.objects.get_for_model(m).id
|
||||
for m in model ]
|
||||
qs = self.filter(related_type__pk__in = model)
|
||||
else:
|
||||
model = ContentType.objects.get_for_model(model)
|
||||
qs = self.filter(related_type__pk = model.id)
|
||||
if object:
|
||||
qs = qs.filter(related_id = object.pk)
|
||||
return qs
|
||||
|
||||
|
||||
class Related(models.Model):
|
||||
"""
|
||||
Add a field "related" of type GenericForeignKey, plus utilities.
|
||||
@ -60,28 +83,7 @@ class Related(models.Model):
|
||||
'related_type', 'related_id',
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def get_for(cl, object = None, model = None):
|
||||
"""
|
||||
Return a queryset that filter on the given object or model(s)
|
||||
|
||||
* object: if given, use its type and pk; match on models only.
|
||||
* model: one model or list of models
|
||||
"""
|
||||
if not model and object:
|
||||
model = type(object)
|
||||
|
||||
if type(model) in (list, tuple):
|
||||
model = [ ContentType.objects.get_for_model(m).id
|
||||
for m in model ]
|
||||
qs = cl.objects.filter(related_type__pk__in = model)
|
||||
else:
|
||||
model = ContentType.objects.get_for_model(model)
|
||||
qs = cl.objects.filter(related_type__pk = model.id)
|
||||
|
||||
if object:
|
||||
qs = qs.filter(related_id = object.pk)
|
||||
return qs
|
||||
objects = RelatedManager()
|
||||
|
||||
class Meta:
|
||||
abstract = True
|
||||
|
Reference in New Issue
Block a user