|
|
@@ -11,6 +11,9 @@ from django.db import models, connection
|
|
|
from django.db.models.aggregates import Sum
|
|
|
from martor.models import MartorField
|
|
|
|
|
|
+def norm(s):
|
|
|
+ return s.lower().replace('é', 'e').replace('è', 'e').replace('ê', 'e').replace('à', 'a').replace('â', 'a').replace('ç', 'c').replace('ô', 'o');
|
|
|
+
|
|
|
class Member(models.Model):
|
|
|
user = models.OneToOneField(User, on_delete=models.CASCADE)
|
|
|
trigram = models.CharField(max_length=5)
|
|
|
@@ -123,6 +126,12 @@ class Epic(BaseModel):
|
|
|
def reopen(self):
|
|
|
self.closed = False
|
|
|
self.save()
|
|
|
+
|
|
|
+ @classmethod
|
|
|
+ def search(cls, qstr):
|
|
|
+ qstr = norm(qstr)
|
|
|
+ dataset = cls.objects.order_by("-updated")
|
|
|
+ return [item for item in dataset if qstr in norm(item.name)]
|
|
|
|
|
|
class Sprint(BaseModel):
|
|
|
class Meta:
|
|
|
@@ -235,7 +244,23 @@ class Story(BaseModel):
|
|
|
|
|
|
def __str__(self):
|
|
|
return self.name
|
|
|
-
|
|
|
+
|
|
|
+ @property
|
|
|
+ def normedname(self):
|
|
|
+ return self.name.lower().replace('é', 'e') \
|
|
|
+ .replace('è', 'e') \
|
|
|
+ .replace('ê', 'e') \
|
|
|
+ .replace('à', 'a') \
|
|
|
+ .replace('â', 'a') \
|
|
|
+ .replace('ç', 'c') \
|
|
|
+ .replace('ô', 'o');
|
|
|
+
|
|
|
+ @classmethod
|
|
|
+ def search(cls, qstr):
|
|
|
+ qstr = norm(qstr)
|
|
|
+ dataset = cls.objects.order_by("-updated")
|
|
|
+ return [item for item in dataset if qstr in norm(item.name)]
|
|
|
+
|
|
|
def running(self):
|
|
|
for sprint in self.sprints.all():
|
|
|
if sprint.running():
|