from django.db import models class Category(models.Model): #id name = models.CharField(max_length=50); def __unicode__(self): return self.name def serializable(self): return {'id': self.id, 'name': self.name } class Pic(models.Model): #id set = models.ForeignKey('feeds.PicSet', null=True,blank=True) title = models.CharField(max_length=128, blank=False) thumbnail_url = models.URLField(blank=True) thumbnail_height = models.PositiveIntegerField(null=True,blank=True) thumbnail_width = models.PositiveIntegerField(null=True,blank=True) original_url = models.URLField(blank=False) original_height = models.PositiveIntegerField(null=True,blank=True) original_width = models.PositiveIntegerField(null=True,blank=True) source_url = models.URLField(blank=True) caption = models.TextField(blank=True) credits = models.TextField(blank=True) is_nsfw = models.NullBooleanField(null=True, blank=True) def __unicode__(self): if len(self.title) > 64: return self.title[:61] + "..." else: return self.title def serializable(self): return {'id': self.id, 'set': {'id': self.set.id, 'title': self.set.title }, 'thumbnail_url': self.thumbnail_url, 'thumbnail_height': self.thumbnail_height, 'thumbnail_width': self.thumbnail_width, 'original_url': self.original_url, 'original_height': self.original_height, 'original_width': self.original_width, 'source_url': self.source_url, 'caption': self.caption, 'credits': self.credits, 'is_nsfw': self.is_nsfw, } def serializable_short(self): # TODO: more here? return {'id': self.id, 'original_url': self.original_url, 'original_height': self.original_height, 'original_width': self.original_width, 'credits': self.credits, } class PicFeed(models.Model): #id created = models.DateTimeField() shortname = models.SlugField(blank=False) source_url = models.URLField(blank=True) rssfeed_url = models.URLField(blank=True) favicon_url = models.URLField(blank=True) is_active = models.BooleanField(default=False) title = models.CharField(max_length=80, blank=True) description = models.TextField(blank=True) image = models.ForeignKey('feeds.Pic', blank=True, null=True) category = models.ForeignKey('feeds.Category', null=True,blank=True) def __unicode__(self): return self.shortname def serializable(self): return {'id': self.id, 'created_unixtime': (int(self.created.strftime("%s")) if self.created else None), 'shortname': self.shortname, 'source_url': self.source_url, 'rssfeed_url': self.rssfeed_url, 'favicon_url': self.favicon_url, 'title': self.title, 'description': self.description, 'image': (self.image.serializable_short() if self.image else None), 'category': (self.category.name if self.category else None), 'last_updated_unixtime': (int(self.picset_set.latest().created.strftime("%s")) if (self.picset_set.count() > 0) else None), } class PicSet(models.Model): #id created = models.DateTimeField(null=True,blank=True) source_url = models.URLField(blank=True) title = models.CharField(max_length=128, blank=False) description = models.TextField(blank=True) credits = models.TextField(blank=True) keywords = models.CharField(max_length=256, blank=True) image = models.ForeignKey('feeds.Pic', null=True,blank=True) feed = models.ForeignKey('feeds.PicFeed', null=True,blank=False) category = models.ForeignKey('feeds.Category', null=True,blank=True) is_nsfw = models.BooleanField(default=False, blank=False); is_valid = models.BooleanField(default=True); def __unicode__(self): if len(self.title) > 64: return self.title[:61] + "..." else: return self.title class Meta: get_latest_by = "created" def serializable(self): return {'id': self.id, 'created_unixtime': (int(self.created.strftime("%s")) if self.created else None), 'source_url': self.source_url, 'title': self.title, 'description': self.description, 'credits': self.credits, 'keywords': self.keywords, 'image': (self.image.serializable_short() if self.image else None), 'pic_count': Pic.objects.filter(set=self.id).count(), 'category': (self.category.name if self.category else None), } # The below search code comes from Julien Phalip import re from django.db.models import Q def normalize_query(query_string, findterms=re.compile(r'"([^"]+)"|(\S+)').findall, normspace=re.compile(r'\s{2,}').sub): ''' Splits the query string in invidual keywords, getting rid of unecessary spaces and grouping quoted words together. Example: >>> normalize_query(' some random words "with quotes " and spaces') ['some', 'random', 'words', 'with quotes', 'and', 'spaces'] ''' return [normspace(' ', (t[0] or t[1]).strip()) for t in findterms(query_string)] def get_query(query_string, search_fields): ''' Returns a query, that is a combination of Q objects. That combination aims to search keywords within a model by testing the given search fields. ''' query = None # Query to search for every search term terms = normalize_query(query_string) for term in terms: or_query = None # Query to search for a given term in each field for field_name in search_fields: q = Q(**{"%s__icontains" % field_name: term}) if or_query is None: or_query = q else: or_query = or_query | q if query is None: query = or_query else: query = query & or_query return query