class Instrument(CarnaticStyle, data.models.Instrument): class Meta: ordering = ['id'] fuzzymanager = managers.FuzzySearchManager() objects = managers.CarnaticInstrumentManager() def ordered_performers(self): artists, counts = self.performers() artists = sorted(artists, key=lambda a: counts[a], reverse=True) return artists def performers(self): artists = Artist.objects.filter( instrumentperformance__instrument=self).annotate( num_times=Count('instrumentperformance__instrument')) artistcount = {} ret = [] for a in artists: ret.append(a) artistcount[a] = a.num_times return ret, artistcount def samples(self, limit=2): IPClass = self.get_object_map("performance") performances = list(IPClass.objects.filter(instrument=self).all()) random.shuffle(performances) perf = performances[:limit] return [p.recording for p in perf]
class Raaga(data.models.BaseModel, data.models.ImageMixin): class Meta: ordering = ['id'] missing_image = "raaga.jpg" name = models.CharField(max_length=50) common_name = models.CharField(max_length=50) uuid = models.UUIDField(db_index=True) image = models.ForeignKey(data.models.Image, blank=True, null=True, related_name="%(app_label)s_%(class)s_image", on_delete=models.CASCADE) objects = managers.CarnaticRaagaManager() fuzzymanager = managers.FuzzySearchManager() def __str__(self): return self.name def get_absolute_url(self): if self.common_name: slug = slugify(self.common_name) else: slug = slugify(self.name) return reverse('carnatic-raaga', args=[str(self.uuid), slug]) def works(self): return self.work_set.distinct().all() def composers(self): return Composer.objects.filter(works__raaga=self).distinct() def artists(self): artistmap = {} artistcounter = collections.Counter() artists = Artist.objects.filter( primary_concerts__recordings__works__raaga=self).filter( main_instrument__in=[1, 2]) for a in artists: artistcounter[a.pk] += 1 if a.pk not in artistmap: artistmap[a.pk] = a artists = [] for aid, count in artistcounter.most_common(): artists.append(artistmap[aid]) return artists def recordings(self, limit=None): recordings = Recording.objects.filter(works__raaga=self) if recordings is not None: recordings = recordings[:limit] return recordings def recordings_form(self, form=None): ret = Recording.objects.filter(Q(works__raaga=self) | Q(raagas=self)) if form: ret = ret.filter(forms__name=form) return ret.all()
class Form(models.Model): name = models.CharField(max_length=50) attrfromrecording = models.BooleanField(default=False) objects = managers.CarnaticFormManager() fuzzymanager = managers.FuzzySearchManager() def __str__(self): return self.name
class FormAlias(models.Model): name = models.CharField(max_length=50) form = models.ForeignKey(Form, related_name="aliases", on_delete=models.CASCADE) objects = managers.FuzzySearchManager() def __str__(self): return self.name
class TaalaAlias(models.Model): name = models.CharField(max_length=50) taala = models.ForeignKey("Taala", related_name="aliases", on_delete=models.CASCADE) fuzzymanager = managers.FuzzySearchManager() objects = models.Manager() def __str__(self): return self.name
class InstrumentAlias(CarnaticStyle, data.models.InstrumentAlias): fuzzymanager = managers.FuzzySearchManager() objects = models.Manager()