From dd76a1a0be0345bf1a2330cefe299af92b9a5721 Mon Sep 17 00:00:00 2001 From: substantialnoninfringinguser Date: Sat, 4 Jul 2009 08:27:49 +0100 Subject: [svn] * Adding JS fill in next QM number via ajax. * Slight models cleanup- get rid of TroggleImageModel class, use mixin instead. * Collect various troggle shared functions into utils.py --- core/models.py | 107 ++++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 79 insertions(+), 28 deletions(-) (limited to 'core/models.py') diff --git a/core/models.py b/core/models.py index 0889f16..1424f40 100644 --- a/core/models.py +++ b/core/models.py @@ -18,8 +18,8 @@ logging.basicConfig(level=logging.DEBUG, filename=settings.LOGFILE, filemode='w') +#This class is for adding fields and methods which all of our models will have. class TroggleModel(models.Model): - """This class is for adding fields and methods which all of our models will have.""" new_since_parsing = models.BooleanField(default=False, editable=False) non_public = models.BooleanField(default=False) def object_name(self): @@ -29,10 +29,22 @@ class TroggleModel(models.Model): return urlparse.urljoin(settings.URL_ROOT, "/admin/core/" + self.object_name().lower() + "/" + str(self.pk)) class Meta: - abstract = True + abstract = True + +class TroggleImageModel(ImageModel): + new_since_parsing = models.BooleanField(default=False, editable=False) + + def object_name(self): + return self._meta.object_name + + def get_admin_url(self): + return urlparse.urljoin(settings.URL_ROOT, "/admin/core/" + self.object_name().lower() + "/" + str(self.pk)) + + + class Meta: + abstract = True class Expedition(TroggleModel): - """Represents a caving expedition""" year = models.CharField(max_length=20, unique=True) name = models.CharField(max_length=100) date_from = models.DateField(blank=True,null=True) @@ -49,16 +61,15 @@ class Expedition(TroggleModel): #return settings.URL_ROOT + "/expedition/%s" % self.year return urlparse.urljoin(settings.URL_ROOT, reverse('expedition',args=[self.year])) + # lose these two functions (inelegant, and we may create a file with the dates that we can load from) def GuessDateFrom(self): - """Returns the date of the first logbook entry in the expedition""" try: return self.logbookentry_set.order_by('date')[0].date except IndexError: pass - def GuessDateTo(self): - """Returns the date of the last logbook entry in the expedition""" + def GuessDateTo(self): # returns the date of the last logbook entry in the expedition try: return self.logbookentry_set.order_by('date')[-1].date except IndexError: @@ -79,27 +90,42 @@ class Expedition(TroggleModel): date+=datetime.timedelta(days=1) return res + + + class Person(TroggleModel): - """Represents a person, also used as the profile model""" first_name = models.CharField(max_length=100) last_name = models.CharField(max_length=100) is_vfho = models.BooleanField(help_text="VFHO is the Vereines für Höhlenkunde in Obersteier, a nearby Austrian caving club.") - mug_shot = models.CharField(max_length=100, blank=True,null=True) #obsolete, remove soon + mug_shot = models.CharField(max_length=100, blank=True,null=True) blurb = models.TextField(blank=True,null=True) - orderref = models.CharField(max_length=200) # for alphabetic + #href = models.CharField(max_length=200) + orderref = models.CharField(max_length=200) # for alphabetic + + #the below have been removed and made methods. I'm not sure what the b in bisnotable stands for. - AC 16 Feb + #notability = models.FloatField() # for listing the top 20 people + #bisnotable = models.BooleanField() user = models.OneToOneField(User, null=True, blank=True) def get_absolute_url(self): return urlparse.urljoin(settings.URL_ROOT,reverse('person',kwargs={'first_name':self.first_name,'last_name':self.last_name})) class Meta: - verbose_name_plural = "People" + verbose_name_plural = "People" + class Meta: ordering = ('orderref',) # "Wookey" makes too complex for: ('last_name', 'first_name') def __unicode__(self): if self.last_name: return "%s %s" % (self.first_name, self.last_name) return self.first_name + +# Below are no longer needed. Use {{ person.personexpedition_set.all.0.expedition }} for Firstexpedition, and {{ person.personexpedition_set.latest.expedition }} for Lastexpedition + # these ought to be possible by piping through |min in the template, or getting the first of an ordered list +# def Firstexpedition(self): +# return self.personexpedition_set.order_by('expedition')[0] +# def Lastexpedition(self): +# return self.personexpedition_set.order_by('-expedition')[0] def notability(self): notability = Decimal(0) @@ -110,9 +136,18 @@ class Person(TroggleModel): def bisnotable(self): return self.notability() > Decimal(1)/Decimal(3) + + #def Sethref(self): + #if self.last_name: + #self.href = self.first_name.lower() + "_" + self.last_name.lower() + #self.orderref = self.last_name + " " + self.first_name + #else: + # self.href = self.first_name.lower() + #self.orderref = self.first_name + #self.notability = 0.0 # set temporarily + class PersonExpedition(TroggleModel): - """""" expedition = models.ForeignKey(Expedition) person = models.ForeignKey(Person) date_from = models.DateField(blank=True,null=True) @@ -199,9 +234,8 @@ class PersonExpedition(TroggleModel): return urlparse.urljoin(settings.URL_ROOT, reverse('personexpedition',kwargs={'first_name':self.person.first_name,'last_name':self.person.last_name,'year':self.expedition.year})) class LogbookEntry(TroggleModel): - """Represents trips of all kinds. This is the central model of Troggle.""" date = models.DateField() - expedition = models.ForeignKey(Expedition,blank=True,null=True) + expedition = models.ForeignKey(Expedition,blank=True,null=True) # yes this is double- author = models.ForeignKey(PersonExpedition,blank=True,null=True) # the person who writes it up doesn't have to have been on the trip. # Re: the above- so this field should be "typist" or something, not "author". - AC 15 jun 09 title = models.CharField(max_length=200) @@ -211,7 +245,9 @@ class LogbookEntry(TroggleModel): slug = models.SlugField(max_length=50) class Meta: - verbose_name_plural = "Logbook Entries" + verbose_name_plural = "Logbook Entries" + # several PersonTrips point in to this object + class Meta: ordering = ('-date',) def get_absolute_url(self): @@ -226,6 +262,18 @@ class LogbookEntry(TroggleModel): def get_previous_by_id(self): LogbookEntry.objects.get(id=self.id-1) + def new_QM_number(self): + """Returns """ + if self.cave: + nextQMnumber=self.cave.new_QM_number(self.date.year) + else: + return none + return nextQMnumber + + def new_QM_found_link(self): + """Produces a link to a new QM with the next number filled in and this LogbookEntry set as 'found by' """ + return settings.URL_ROOT + r'/admin/core/qm/add/?' + r'found_by=' + str(self.pk) +'&number=' + str(self.new_QM_number()) + class PersonTrip(TroggleModel): person_expedition = models.ForeignKey(PersonExpedition,null=True) @@ -246,6 +294,9 @@ class PersonTrip(TroggleModel): else: return self.logbook_entry.place + #persontrip_next = models.ForeignKey('PersonTrip', related_name='pnext', blank=True,null=True) + #persontrip_prev = models.ForeignKey('PersonTrip', related_name='pprev', blank=True,null=True) + def __unicode__(self): return "%s %s (%s)" % (self.person_expedition, self.place(), self.date()) @@ -261,6 +312,7 @@ class PersonTrip(TroggleModel): except: return +# def get_persons_previous_trip(self): # # move following classes into models_cave # @@ -336,7 +388,15 @@ class Cave(TroggleModel): def get_QMs(self): return QM.objects.filter(found_by__cave=self) - + + def new_QM_number(self, year=datetime.date.today().year): + """Given a cave and the current year, returns the next QM number.""" + try: + res=QM.objects.filter(found_by__date__year=year, found_by__cave=self).order_by('-number')[0] + except IndexError: + return 1 + return res.number+1 + def kat_area(self): for a in self.area.all(): if a.kat_area(): @@ -373,13 +433,6 @@ class Cave(TroggleModel): res += "–" + prevR return res - def nextQMnumber(self, year=datetime.date.today().year): - """ - Given a cave and the current year, returns the next QM number. - """ - res=QM.objects.filter(found_by__date__year=year, found_by__cave=self).order_by('-number')[0] - return res.number+1 - class OtherCaveName(TroggleModel): name = models.CharField(max_length=160) cave = models.ForeignKey(Cave) @@ -506,7 +559,7 @@ class QM(TroggleModel): #"Number","Grade","Area","Description","Page reference","Nearest station","Completion description","Comment" found_by = models.ForeignKey(LogbookEntry, related_name='QMs_found',blank=True, null=True ) ticked_off_by = models.ForeignKey(LogbookEntry, related_name='QMs_ticked_off',null=True,blank=True) - number = models.IntegerField(help_text="this is the sequential number in the year") + number = models.IntegerField(help_text="this is the sequential number in the year", ) GRADE_CHOICES=( ('A', 'A: Large obvious lead'), ('B', 'B: Average lead'), @@ -522,9 +575,7 @@ class QM(TroggleModel): area = models.CharField(max_length=100,blank=True,null=True) completion_description = models.TextField(blank=True,null=True) comment=models.TextField(blank=True,null=True) - #the below are unneeded- instead use the date fields of the QM's trips - #dateFound = models.DateField(blank=True) - #dateKilled = models.DateField(blank=True) + def __unicode__(self): QMnumber=str(self.found_by.cave)+'-'+str(self.found_by.date.year)+"-"+str(self.number)+self.grade return str(QMnumber) @@ -546,7 +597,7 @@ class QM(TroggleModel): return res photoFileStorage = FileSystemStorage(location=settings.PHOTOS_ROOT, base_url=settings.PHOTOS_URL) -class Photo(ImageModel, TroggleModel): +class Photo(TroggleImageModel): caption = models.CharField(max_length=1000,blank=True,null=True) contains_logbookentry = models.ForeignKey(LogbookEntry,blank=True,null=True) contains_person = models.ManyToManyField(Person,blank=True,null=True) @@ -578,7 +629,7 @@ def get_scan_path(instance, filename): number="%02d" % instance.survey.wallet_number + str(instance.survey.wallet_letter) #using %02d string formatting because convention was 2009#01 return os.path.join('./',year,year+r'#'+number,instance.contents+str(instance.number_in_wallet)+r'.jpg') -class ScannedImage(ImageModel, TroggleModel): +class ScannedImage(TroggleImageModel): file = models.ImageField(storage=scansFileStorage, upload_to=get_scan_path) scanned_by = models.ForeignKey(Person,blank=True, null=True) scanned_on = models.DateField(null=True) -- cgit v1.2.3