summaryrefslogtreecommitdiffstats
path: root/core/models.py
diff options
context:
space:
mode:
authorsubstantialnoninfringinguser <substantialnoninfringinguser@gmail.com>2009-07-04 08:27:49 +0100
committersubstantialnoninfringinguser <substantialnoninfringinguser@gmail.com>2009-07-04 08:27:49 +0100
commitb816463d1d81faeba373349c2728d435515a0a45 (patch)
tree7c051e8b06fe40b10f57d80e8bb76dbc4a8a3d64 /core/models.py
parent96533882c7c251dc039359b36dd2830c02976b1f (diff)
downloadtroggle-b816463d1d81faeba373349c2728d435515a0a45.tar.gz
troggle-b816463d1d81faeba373349c2728d435515a0a45.tar.bz2
troggle-b816463d1d81faeba373349c2728d435515a0a45.zip
[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
Diffstat (limited to 'core/models.py')
-rw-r--r--core/models.py107
1 files changed, 79 insertions, 28 deletions
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&uuml;r H&ouml;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 += "&ndash;" + 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)