class Form(models.Model): name = models.CharField(max_length=50) objects = managers.FuzzySearchManager() def __unicode__(self): return self.name
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 Language(CarnaticStyle, models.Model): name = models.CharField(max_length=50) objects = managers.FuzzySearchManager() def __unicode__(self): return self.name
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") objects = managers.CarnaticRaagaManager() fuzzymanager = managers.FuzzySearchManager() def __unicode__(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 FormAlias(models.Model): name = models.CharField(max_length=50) form = models.ForeignKey(Form, related_name="aliases") objects = managers.FuzzySearchManager() def __unicode__(self): return self.name
class LanguageAlias(CarnaticStyle, models.Model): name = models.CharField(max_length=50) language = models.ForeignKey(Language, related_name="aliases") objects = managers.FuzzySearchManager() def __unicode__(self): return self.name
class TaalaAlias(models.Model): name = models.CharField(max_length=50) taala = models.ForeignKey("Taala", related_name="aliases") fuzzymanager = managers.FuzzySearchManager() objects = models.Manager() def __unicode__(self): return self.name
class Form(models.Model): name = models.CharField(max_length=50) attrfromrecording = models.BooleanField(default=False) objects = managers.CarnaticFormManager() fuzzymanager = managers.FuzzySearchManager() def __unicode__(self): return self.name
class Instrument(CarnaticStyle, data.models.Instrument): objects = managers.FuzzySearchManager() def description(self): return "The description of an instrument" def ordered_performers(self): perfs, counts = self.performers() perfs = sorted(perfs, key=lambda p: counts[p.performer], reverse=True) return perfs def performers(self): IPClass = self.get_object_map("performance") performances = IPClass.objects.filter(instrument=self).distinct() ret = [] artists = [] # Sort how many performances this artist makes artistcount = collections.Counter() for p in performances: artistcount[p.performer] += 1 if p.performer not in artists: ret.append(p) artists.append(p.performer) # TODO: This might be slow getting 2 sets of performances and doing tests ICPClass = self.get_object_map("releaseperformance") performances = ICPClass.objects.filter(instrument=self).distinct() for p in performances: artistcount[p.performer] += 1 if p.performer not in artists: ret.append(p) artists.append(p.performer) return ret, artistcount def references(self): pass 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] @classmethod def get_filter_criteria(cls): ret = { "url": reverse('carnatic-instrument-search'), "name": "Instrument", "data": [filters.Text().object] } return ret
class Instrument(CarnaticStyle, data.models.Instrument): fuzzymanager = managers.FuzzySearchManager() objects = managers.CarnaticInstrumentManager() def description(self): return "The description of an instrument" 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 references(self): pass 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] @classmethod def get_filter_criteria(cls): ret = {"url": reverse('carnatic-instrument-search'), "name": "Instrument", } return ret
class InstrumentAlias(CarnaticStyle, data.models.InstrumentAlias): fuzzymanager = managers.FuzzySearchManager() objects = models.Manager()
class Taala(data.models.BaseModel): missing_image = "taala.jpg" name = models.CharField(max_length=50) common_name = models.CharField(max_length=50) num_aksharas = models.IntegerField(null=True) uuid = models.UUIDField(db_index=True) objects = managers.CarnaticTaalaManager() fuzzymanager = managers.FuzzySearchManager() def __unicode__(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-taala', args=[str(self.uuid), slug]) def get_similar(self): if self.pk in taala_similar: return [Taala.objects.get(pk=id) for id in taala_similar[self.pk]] else: return [] @classmethod def get_filter_criteria(cls): ret = {"url": reverse('carnatic-taala-search'), "name": "Taala", } return ret def works(self): return self.work_set.distinct().all() def composers(self): return Composer.objects.filter(works__taala=self).distinct() def artists(self): return Artist.objects.filter(primary_concerts__recordings__works__taala=self).distinct() def percussion_artists(self): artistmap = {} artistcounter = collections.Counter() artists = Artist.objects.filter(Q(instrumentperformance__recording__works__taala=self) & Q(instrumentperformance__instrument__percussion=True)) 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__taala=self) if recordings is not None: recordings = recordings[:limit] return recordings def recordings_form(self, form=None): ret = self.recording_set if form: ret = ret.filter(forms__name=form) return ret.all()
class Raaga(data.models.BaseModel): missing_image = "raaga.jpg" name = models.CharField(max_length=50) common_name = models.CharField(max_length=50) uuid = models.UUIDField(db_index=True) objects = managers.CarnaticRaagaManager() fuzzymanager = managers.FuzzySearchManager() def __unicode__(self): return self.name @classmethod def get_filter_criteria(cls): ret = {"url": reverse('carnatic-raaga-search'), "name": "Raaga", } return ret 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 get_similar(self): if self.pk in raaga_similar: sim = [] for id in raaga_similar[self.pk]: try: sim.append(Raaga.objects.get(pk=id)) except Raaga.DoesNotExist: pass return sim else: return [] 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 Taala(data.models.BaseModel): missing_image = "taala.jpg" name = models.CharField(max_length=50) transliteration = models.CharField(max_length=50) objects = managers.FuzzySearchManager() def __unicode__(self): return self.name.capitalize() def get_similar(self): if self.pk in taala_similar: return [Taala.objects.get(pk=id) for id in taala_similar[self.pk]] else: return [] @classmethod def get_filter_criteria(cls): ret = { "url": reverse('carnatic-taala-search'), "name": "Taala", "data": [filters.Text().object] } return ret def get_absolute_url(self): return reverse('carnatic-taala', args=[str(self.id)]) def works(self): return self.work_set.distinct().all() def composers(self): return Composer.objects.filter(work__taala=self).distinct() def artists(self): return Artist.objects.filter( primary_concerts__tracks__work__taala=self).distinct() def percussion_artists(self): artistmap = {} artistcounter = collections.Counter() artists = Artist.objects.filter( Q(instrumentconcertperformance__concert__tracks__work__taala=self) & Q(instrumentconcertperformance__instrument__percussion=True)) for a in artists: artistcounter[a.pk] += 1 if a.pk not in artistmap: artistmap[a.pk] = a artists = Artist.objects.filter( Q(instrumentperformance__recording__work__taala=self) & Q(instrumentperformance__instrument__percussion=True)) 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(work__taala=self) if recordings is not None: recordings = recordings[:limit] return recordings
class Raaga(data.models.BaseModel): missing_image = "raaga.jpg" name = models.CharField(max_length=50) transliteration = models.CharField(max_length=50) objects = managers.FuzzySearchManager() def __unicode__(self): return self.name.capitalize() @classmethod def get_filter_criteria(cls): ret = { "url": reverse('carnatic-raaga-search'), "name": "Raaga", "data": [filters.Text().object] } return ret def get_absolute_url(self): return reverse('carnatic-raaga', args=[str(self.id)]) def works(self): return self.work_set.distinct().all() def composers(self): return Composer.objects.filter(work__raaga=self).distinct() def artists(self): artistmap = {} artistcounter = collections.Counter() artists = Artist.objects.filter( primary_concerts__tracks__work__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 get_similar(self): if self.pk in raaga_similar: for id in raaga_similar[self.pk]: sim = [] try: sim.append(Raaga.objects.get(pk=id)) except Raaga.DoesNotExist: pass return sim else: return [] def recordings(self, limit=None): recordings = Recording.objects.filter(work__raaga=self) if recordings is not None: recordings = recordings[:limit] return recordings