use facets for exact search

This commit is contained in:
j 2010-07-15 17:55:10 +02:00
parent f7074775d6
commit 8c5e321cbc
2 changed files with 16 additions and 8 deletions

View file

@ -47,12 +47,19 @@ def parseCondition(condition):
else: else:
exclude = False exclude = False
if keyType(k) == "string": if keyType(k) == "string":
in_find=True
if op == '=': if op == '=':
'''
if k in ('director', 'country', 'language', 'genre', if k in ('director', 'country', 'language', 'genre',
'keywords', 'location', 'writer', 'producer', 'keywords', 'location', 'writer', 'producer',
'editor', 'cinematographer'): 'editor', 'cinematographer'):
k = '%s__icontains' % k k = '%s__icontains' % k
v = u'|%s|'%v v = u'|%s|'%v
'''
if k in models.Movie.facet_keys:
in_find=False
v = models.Movie.objects.filter(facets__key=k, facets__value=v)
k = 'id__in'
else: else:
k = '%s__iexact' % k k = '%s__iexact' % k
elif op == '^': elif op == '^':
@ -63,7 +70,7 @@ def parseCondition(condition):
k = '%s__iendswith' % k k = '%s__iendswith' % k
else: # elif op == '~': else: # elif op == '~':
k = '%s__icontains' % k k = '%s__icontains' % k
if not k.startswith('movieId'): if in_find and not k.startswith('movieId'):
k = 'find__%s' % k k = 'find__%s' % k
k = str(k) k = str(k)
if exclude: if exclude:

View file

@ -83,6 +83,9 @@ def poster_path(f):
return os.path.join('poster', url_hash[:2], url_hash[2:4], url_hash[4:6], name) return os.path.join('poster', url_hash[:2], url_hash[2:4], url_hash[4:6], name)
class Movie(models.Model): class Movie(models.Model):
person_keys = ('director', 'writer', 'producer', 'editor', 'cinematographer')
facet_keys = person_keys + ('country', 'language', 'genre', 'keyword')
created = models.DateTimeField(auto_now_add=True) created = models.DateTimeField(auto_now_add=True)
modified = models.DateTimeField(auto_now=True) modified = models.DateTimeField(auto_now=True)
published = models.DateTimeField(default=datetime.now, editable=False) published = models.DateTimeField(default=datetime.now, editable=False)
@ -253,8 +256,7 @@ class Movie(models.Model):
f.year = self.get('year', '') f.year = self.get('year', '')
for key in ('directors', 'country', 'language', 'writer', 'producer', for key in self.facet_keys:
'editor', 'cinematographer', 'genre', 'keyword'):
setattr(f, key, '|%s|'%'|'.join(self.get(plural_key(key), []))) setattr(f, key, '|%s|'%'|'.join(self.get(plural_key(key), [])))
f.actor = '|%s|'%'|'.join([i[0] for i in self.get('actor', [])]) f.actor = '|%s|'%'|'.join([i[0] for i in self.get('actor', [])])
@ -305,7 +307,7 @@ class Movie(models.Model):
s.country = ','.join(self.get('countries', [])) s.country = ','.join(self.get('countries', []))
s.year = self.get('year', '') s.year = self.get('year', '')
for key in ('director', 'writer', 'producer', 'editor', 'cinematographer'): for key in self.person_keys:
setattr(s, key, sortNames(self.get(plural_key(key), []))) setattr(s, key, sortNames(self.get(plural_key(key), [])))
for key in ('language', 'country'): for key in ('language', 'country'):
@ -339,7 +341,7 @@ class Movie(models.Model):
s.files = 0 #FIXME s.files = 0 #FIXME
s.size = 0 #FIXME s.size = 0 #FIXME
for key in ('title', 'director', 'writer', 'producer', 'editor', 'cinematographer', 'language', 'country'): for key in ('title', 'language', 'country') + self.person_keys:
setattr(s, '%s_desc'%key, getattr(s, key)) setattr(s, '%s_desc'%key, getattr(s, key))
if not getattr(s, key): if not getattr(s, key):
setattr(s, key, u'zzzzzzzzzzzzzzzzzzzzzzzzz') setattr(s, key, u'zzzzzzzzzzzzzzzzzzzzzzzzz')
@ -352,7 +354,7 @@ class Movie(models.Model):
def updateFacets(self): def updateFacets(self):
#"year", is extra is it? #"year", is extra is it?
#FIXME: what to do with Unkown Director, Year, Country etc. #FIXME: what to do with Unkown Director, Year, Country etc.
for key in ("director", "country", 'writer', 'producer', 'editor', 'cinematographer', "language", "genre"): for key in self.facet_keys:
current_values = self.get(plural_key(key), []) current_values = self.get(plural_key(key), [])
saved_values = [i.value for i in Facet.objects.filter(movie=self, key=key)] saved_values = [i.value for i in Facet.objects.filter(movie=self, key=key)]
removed_values = filter(lambda x: x not in current_values, saved_values) removed_values = filter(lambda x: x not in current_values, saved_values)
@ -361,7 +363,7 @@ class Movie(models.Model):
for value in current_values: for value in current_values:
if value not in saved_values: if value not in saved_values:
value_sort = value value_sort = value
if key in ('director', ): if key in self.person_keys:
value_sort = getPersonSort(value) value_sort = getPersonSort(value)
f = Facet(key=key, value=value, value_sort=value_sort) f = Facet(key=key, value=value, value_sort=value_sort)
f.movie = self f.movie = self
@ -372,7 +374,6 @@ class Movie(models.Model):
else: else:
Facet.objects.filter(movie=self, key='year').delete() Facet.objects.filter(movie=self, key='year').delete()
class MovieFind(models.Model): class MovieFind(models.Model):
""" """
used to search movies, all search values are in here used to search movies, all search values are in here