class Blog(models.Model): title = models.CharField(max_length=100) type = models.IntegerField(default=0) img = models.CharField(max_length=500, null=True) # 博客导图 summary = models.CharField(max_length=500, null=True) rss = models.CharField(max_length=1024, null=True) # 订阅源 content = wmd_models.MarkDownField() content_show = wmd_models.MarkDownField(u'正文显示', null=True) add_date = models.DateTimeField() counts = models.IntegerField(default=0) # 点击率 is_show = models.CharField(max_length=100, null=True) # 加密 def __unicode__(self): return self.title def save(self, force_insert=False, force_update=False, using=None): self.content_show = mark_safe(markdown.markdown(force_unicode(self.content), ['codehilite'], safe_mode='escape')) super(Blog, self).save() class Meta: db_table = 'blog' def getType(self): """获取类型""" return Type.objects.get(pk=self.type) def getTags(self): """获取标签""" return BlogTag.objects.filter(blog=self.id)
class Blog(models.Model): """ 文章 """ title = models.CharField(max_length=100) author = models.CharField(max_length=100) type = models.IntegerField(default=0) img = models.CharField(max_length=500, null=True) # 博客引导图片 summary = models.CharField(max_length=500, null=True) rss = models.CharField(max_length=1024, null=True) # rss订阅源 content = wmd_models.MarkDownField() content_show = wmd_models.MarkDownField(u'正文显示', null=True) add_date = models.DateTimeField() counts = models.IntegerField(default=1) # 点击率 is_show = models.CharField(max_length=100, null=True) def __unicode__(self): return self.title class Meta: db_table = 'blog' def getType(self): """ 获取类型 """ return Type.objects.get(pk=self.type) def getTags(self): """ 获取标签 """ return BlogTag.objects.filter(blog=self.id)
class Link(models.Model): title = models.CharField(max_length=250) slug = models.SlugField(unique_for_date='pub_date', help_text='Must be unique for the publication date.') url = models.URLField(unique=True) description = wmd_models.MarkDownField() # See comments in class Entry body and body_html field description_html = wmd_models.MarkDownField(editable = False, blank = True) via_name = models.CharField(max_length=250, blank=True, help_text='The name of the person whose site you spotted the link on. Optional.') via_url = models.URLField(blank=True, help_text='The URL of the site where you spotted the link. Optional.') enable_comments = models.BooleanField(default=True) posted_by = models.ForeignKey(User) pub_date = models.DateTimeField(default=datetime.datetime.now) categories = models.ManyToManyField(Category) tags = TagField() class Meta: ordering = ['-pub_date'] def __unicode__(self): return self.title def save(self, force_insert = False, force_update = False): self.description_html = markdown(self.description) super(Link, self).save(force_insert, force_update) @models.permalink def get_absolute_url(self): return ('coltrane_link_detail', (), { 'year': self.pub_date.strftime('%Y'), 'month': self.pub_date.strftime('%b').lower(), 'day': self.pub_date.strftime('%d'), 'slug': self.slug })
class Theme(models.Model): """编程主题""" TYPE = ( (0, u'未进行'), (1, u'进行中'), (2, u'已完成'), (3, u'任务失败'), ) title = models.CharField(max_length=100) user = models.IntegerField() type = models.IntegerField(default=0) summary = models.CharField(max_length=500, null=True) content = wmd_models.MarkDownField() content_show = wmd_models.MarkDownField(u'正文显示', null=True) start_date = models.DateField() end_date = models.DateField() add_date = models.DateTimeField() status = models.IntegerField(default=0, choices=TYPE) schedule = models.IntegerField(default=0) # 进度 is_great = models.IntegerField(default=0) # 是否精华 counts = models.IntegerField(default=0) # 点击率 def __unicode__(self): return self.title def save(self, force_insert=False, force_update=False, using=None): self.content_show = mark_safe( markdown.markdown(force_unicode(self.content), ['codehilite'], safe_mode='escape')) super(Theme, self).save() class Meta: db_table = 'theme' def getUser(self): """返回用户对象""" return MyUser.objects.get(pk=self.user) def getLove(self): """返回关注数""" return Love.objects.filter(theme=self.id).count() def getLoveObj(self): """返回关注数""" return Love.objects.filter(theme=self.id).values_list('user', flat=True) def getTags(self): """获取标签""" return ThemeTag.objects.filter(theme=self.id) def getType(self): """获取类型""" return Type.objects.get(pk=self.type, user=self.user)
class Wiki(models.Model): """WIki""" category = models.IntegerField() content = wmd_models.MarkDownField() content_show = wmd_models.MarkDownField(u'show', null=True) add_time = models.DateTimeField(auto_now=True, auto_now_add=True) class Meta: db_table = 'wiki' def save(self, force_insert=False, force_update=False, using=None): self.content_show = mark_safe(markdown.markdown(force_unicode(self.content), ['codehilite'], safe_mode='escape')) super(Wiki, self).save()
class Event(PhotosMixin,models.Model): _use_default_photo = True name = models.CharField(max_length=128,null=True,blank=True) url = models.CharField(max_length=256,null=True,blank=True) _ht = "Optional. Alternative name for the calendar." short_name = models.CharField(max_length=64,null=True,blank=True,help_text=_ht) room = models.ForeignKey(Room,null=True,blank=True) #! remove ntbt when you remove location. get_room = lambda self: self.room description = wmd_models.MarkDownField(blank=True,null=True) _ht = "If your changing this, you will need to manually delete all future incorrect events." _ht += "Repeating events are auto-generated every night." repeat = models.CharField(max_length=32,choices=REPEAT_CHOICES,null=True,blank=True,help_text=_ht) _ht = "If true, this class will not raise conflict warnings for events in the same room." no_conflict = models.BooleanField(default=False,help_text=_ht) _ht = "Hidden stuff won't appear on the calendar." hidden = models.BooleanField(default=False) allow_rsvp = models.BooleanField(default=True) _ht = "Number of days before event when RSVP is cut off (eg 0.5 means \"You must rsvp 12 hours before this event\")" rsvp_cutoff = models.FloatField(default=0,help_text=_ht) max_rsvp = models.IntegerField(default=128) icon = models.CharField(max_length=16,choices=ICON_CHOICES) @property def verbose_rsvp_cutoff(self): if self.rsvp_cutoff > 2: s = "{} days".format(int(self.rsvp_cutoff)) else: s = "{} hours".format(int(math.ceil(12*self.rsvp_cutoff))) return "You must RSVP for this event at least {} before the event begins.".format(s) get_short_name = lambda self: self.short_name or self.name def get_absolute_url(self): return reverse("event:event_detail",args=[self.pk,slugify(self.name)]) @property def all_occurrences(self): return self.eventoccurrence_set.all() @property def upcoming_occurrences(self): return self.eventoccurrence_set.filter(start__gte=datetime.datetime.now()-datetime.timedelta(0.5)) @property def next_occurrence(self): if not self.upcoming_occurrences.count(): return None return self.upcoming_occurrences[0] def get_user_rsvps(self,user): occurrence_ids = self.all_occurrences.values_list('id',flat=True) rsvps = RSVP.objects.filter( user=user, object_id__in=occurrence_ids, content_type_id=ContentType.objects.get(model="eventoccurrence").id ) return {r.object_id:r.quantity for r in rsvps} def get_name(self): return self.name or self.room get_ics_url = lambda self: reverse_ics(self) __unicode__ = lambda self: "%s@%s"%(self.name,self.room) class Meta: pass
class Thing(PhotosMixin, ToolsMixin, FilesMixin, UserModel): feed_item_type = 'thing' title = models.CharField(max_length=128) description = wmd_models.MarkDownField(blank=True, null=True) publish_dt = models.DateTimeField(auto_now_add=True) featured = models.BooleanField(default=False) active = models.BooleanField(default=False) parent_link = models.URLField(null=True, blank=True) parent = models.ForeignKey("self", null=True, blank=True) materials = models.ManyToManyField(Material, blank=True) session = models.ForeignKey(Session, null=True, blank=True) __unicode__ = lambda self: self.title get_absolute_url = lambda self: reverse( 'thing_detail', args=[self.id, slugify(self.title)]) get_short_description = lambda self: self.description related_by_user = lambda self: Thing.objects.filter(user=self.user ).exclude(pk=self.pk) def get_parent_text(self): if "thingiverse.com" in self.parent_link: return "View on Thingiverse!" return "View on %s" % ( self.parent_link.split("//")[-1].split('/')[0].split('www.')[-1]) class Meta: ordering = ('-publish_dt', )
class EventOccurrence(PhotosMixin, OccurrenceModel): event = models.ForeignKey(Event) publish_dt = models.DateTimeField( default=datetime.datetime.now) # for rss feed get_admin_url = lambda self: "/admin/event/event/%s/" % self.event.id name_override = models.CharField(null=True, blank=True, max_length=128) name = property(lambda self: self.name_override or self.event.name) short_name = property( lambda self: self.name_override or self.event.get_short_name()) url = property(lambda self: self.url_override or self.event.url) description_override = wmd_models.MarkDownField(blank=True, null=True) description = property( lambda self: self.description_override or self.event.description) get_room = lambda self: self.event.room #! depracate me room = cached_property(lambda self: self.event.room, name="room") no_conflict = property(lambda self: self.event.no_conflict) url_override = models.CharField(max_length=256, null=True, blank=True) _get_absolute_url = lambda self: reverse( 'event:occurrence_detail', args=(self.id, slugify(self.name))) get_absolute_url = lambda self: self.url_override or self.event.url or self._get_absolute_url( ) get_absolute_url = cached_method(get_absolute_url, name="get_absolute_url") rsvp_cutoff = property( lambda self: self.start - datetime.timedelta(self.event.rsvp_cutoff)) total_rsvp = property( lambda self: sum([r.quantity for r in self.get_rsvps()])) full = property(lambda self: self.total_rsvp >= self.event.max_rsvp) icon = property(lambda self: self.event.icon) _cid = ContentType.objects.get(model="eventoccurrence").id @cached_method def get_rsvps(self): return RSVP.objects.filter(object_id=self.id, content_type_id=self._cid) def save(self, *args, **kwargs): # set the publish_dt to a week before the event self.publish_dt = self.start - datetime.timedelta(7) super(EventOccurrence, self).save(*args, **kwargs) @property def past(self): now = datetime.datetime.now() return (self.end < now) or (self.rsvp_cutoff < now and not self.get_rsvps().count()) @property def as_json(self): return { 'room_id': self.event.room_id, 'name': self.name, 'start': str(self.start), 'end': str(self.end), } class Meta: ordering = ('start', )
class Entry(models.Model): LIVE_STATUS = 1 DRAFT_STATUS = 2 HIDDEN_STATUS = 3 STATUS_CHOICES = ( (LIVE_STATUS, 'Live'), (DRAFT_STATUS, 'Draft'), (HIDDEN_STATUS, 'Hidden'), ) title = models.CharField(max_length=250) slug = models.SlugField(unique_for_date='pub_date') body = wmd_models.MarkDownField(verbose_name = 'Content') # In content window, we want to display body itself rather than body with html tags # So we let 'body_html' field store 'markdown(body)' body_html = wmd_models.MarkDownField(editable = False, blank = True) pub_date = models.DateTimeField(default=datetime.datetime.now, verbose_name = 'Date Published') author = models.ForeignKey(User) enable_comments = models.BooleanField(default=True) status = models.IntegerField(choices=STATUS_CHOICES, default=LIVE_STATUS) categories = models.ManyToManyField(Category) tags = TagField() # Need to be this way around so that non-live entries will show up in Admin, which uses the default (first) manager. live = LiveEntryManager() objects = models.Manager() class Meta: ordering = ['-pub_date'] verbose_name_plural = "Entries" def __unicode__(self): return self.title def save(self, force_insert = False, force_update = False): self.body_html = markdown(self.body) super(Entry, self).save(force_insert, force_update) @models.permalink def get_absolute_url(self): return ('coltrane_entry_detail', (), { 'year': self.pub_date.strftime("%Y"), 'month': self.pub_date.strftime("%b").lower(), 'day': self.pub_date.strftime("%d"), 'slug': self.slug })
class Comment(models.Model): """评论""" type = models.IntegerField(default=1) # 1:theme;2:share obj = models.IntegerField() # 评论对象id user = models.ForeignKey(settings.AUTH_USER_MODEL) # 用户 content = wmd_models.MarkDownField() content_show = wmd_models.MarkDownField(u'正文显示', null=True) reply_id = models.IntegerField(default=0) # 回复的评论id reply_user = models.IntegerField(default=0) # 回复谁 add_date = models.DateTimeField(auto_now=True) def save(self, force_insert=False, force_update=False, using=None): self.content_show = mark_safe( markdown.markdown(force_unicode(self.content), ['codehilite'], safe_mode='escape')) super(Comment, self).save() class Meta: db_table = 'comment'
class Job(models.Model): title = models.CharField(max_length=50, verbose_name=_('job title'), help_text=_('job title')) slug = models.SlugField(max_length=50) description = wmd_models.MarkDownField() posted = models.DateTimeField(auto_now_add=True) location = models.CharField(max_length=128, null=True, blank=True, help_text=_('job location')) onsite_required = models.BooleanField(default=True) job_type = models.CharField(max_length=1, choices=TYPE) category = models.ForeignKey(JobCategory, verbose_name=_('job category')) to_apply = models.CharField( max_length=128, verbose_name=_('how to apply'), help_text=_('"Send your resume to John Doe ([email protected])"')) website = models.URLField(verify_exists=False, null=True, blank=True, help_text=_('"www.company.com"')) company_name = models.CharField(max_length=128) viewed = models.IntegerField(editable=False, default=1) checklist = models.ManyToManyField(Checklist, through='JobChecklist') objects = JobManager() def __unicode__(self): return self.title def get_absolute_url(self): return "/%d/%s/" % (self.id, self.slug) def save(self): self.slug = slugify(self.title) super(Job, self).save() try: ping_google() except Exception: # Bare 'except' because we could get a variety # of HTTP-related exceptions. pass def on_job_view(sender, **kwargs): job = kwargs['job'] job.viewed = job.viewed + 1 job.save() view_job.connect(on_job_view) class Meta: ordering = ['-posted'] get_latest_by = 'posted'
class Entry(models.Model): LIVE_STATUS = 1 DRAFT_STATUS = 2 HIDDEN_STATUS = 3 STATUS_CHOICES = ( (LIVE_STATUS, 'Live'), (DRAFT_STATUS, 'Draft'), (HIDDEN_STATUS, 'Hidden'), ) title = models.CharField(max_length=250) excerpt = models.TextField(blank=True) #body = models.TextField() body = wmd_models.MarkDownField() pub_date = models.DateTimeField(default=datetime.datetime.now) slug = models.SlugField(unique_for_date='pub_date') author = models.ForeignKey(User) enable_comments = models.BooleanField(default=True) featured = models.BooleanField(default=False) status = models.IntegerField(choices=STATUS_CHOICES, default=LIVE_STATUS) categories = models.ManyToManyField(Category) tags = TagField() excerpt_html = models.TextField(editable=False, blank=True) body_html = models.TextField(editable=False, blank=True) img = models.ImageField(upload_to="Image") def save(self, force_insert=False, force_update=False): self.body_html = markdown(self.body) if self.excerpt: self.excerpt_html = markdown(self.excerpt) super(Entry, self).save(force_insert, force_update) live = LiveEntryManager() objects = models.Manager() class Meta: verbose_name_plural = "Entries" ordering = ['-pub_date'] def __unicode__(self): return self.title @models.permalink def get_absolute_url(self): return ('blog_entry_detail', (), { 'year': self.pub_date.strftime("%Y"), 'month': self.pub_date.strftime("%b").lower(), 'day': self.pub_date.strftime("%d"), 'slug': self.slug })
class Article(models.Model): """ A simple model. Use Article.get_articles(CATEGORY=None, TAG=None, NUM=100) to get available articles list. Use Article.get_recently_articles(RECENTLY_ARTICLES_NUM) to get recently(RECENTLY_ARTICLES_NUM) articles. Use Article.get_hots_articles(HOT_ARTICLES_NUM) to get hot(HOT_ARTICLES_NUM) articles. Use article_object.related_articles(REALITVE_ARTICLES_NUM) to get related_articles of an object. """ author = models.ForeignKey(User, verbose_name=_(u"Author")) category = models.ForeignKey(Category, verbose_name=_(u'Category')) title = models.CharField(max_length=100, verbose_name=_(u'Title')) tags = models.CharField(max_length=100, null=True, blank=True, verbose_name=_(u'Tags'), help_text=_(u"Use the comma(',') separated")) summary = models.TextField(verbose_name=_(u'Summary'), validators=[MinLengthValidator(30)], error_messages={ "min_length": _("At least %(limit_value)d word,please!\ (it has %(show_value)d).") }) content = wmd_models.MarkDownField(verbose_name=_(u'Content')) title_image = ProcessedImageField(upload_to='thumbnail', processors=[ResizeToFill(70, 70)], format='JPEG', options={'quality': 60}) status = models.IntegerField(default=0, choices=STATUS.items(), verbose_name=_(u'Status')) view_times = models.IntegerField(default=1) is_top = models.BooleanField(default=False, verbose_name=_(u'Top')) create_time = models.DateTimeField(_(u'Create Time'), auto_now_add=True, editable=True) update_time = models.DateTimeField(_(u'Update Time'), auto_now=True) def __unicode__(self): return self.title def tags_list(self): """ Use article_object.tags_list() to split and get article_object's tags. """ return [tag.strip() for tag in self.tags.split(',')] def related_articles(self, num): """ A simple method. Use article_object.related_articles(REALITVE_ARTICLES_NUM) to get related_articles of an object. """ related_articles = None try: related_articles = Article.objects.values('id', 'title', 'view_times', 'update_time', 'author').\ filter(tags__icontains=self.tags_list()[0]).\ exclude(id=self.id)[:num] except IndexError: pass if not related_articles: related_articles = Article.objects.values('id', 'title', 'view_times', 'update_time', 'author').\ filter(category=self.category).\ exclude(id=self.id)[:num] return related_articles @classmethod def get_articles(cls, CATEGORY=None, TAG=None, NUM=100): """ A simple classmethod. Use Article.get_articles(CATEGORY=None, TAG=None, NUM=100) to get articles list. """ if CATEGORY: article_list = cls.objects.filter( Q(status=0) & Q(category__name__icontains=CATEGORY))[:NUM] return article_list if TAG: article_list = cls.objects.filter( Q(status=0) & Q(tags__icontains=TAG))[:NUM] return article_list return cls.objects.filter(status=0)[:NUM] @classmethod def get_all_tags_list(cls): """ A simple classmethod. Use Article.get_all_tags_list() to get all articles' tags list. """ all_tags_list = [] # obj_list = cls.objects.filter(status=0).order_by('-update_time') obj_list = Article.get_articles(NUM=1000) for obj in obj_list: all_tags_list = all_tags_list + obj.tags_list() # for tag in obj.tags.split(','): # all_tags_list.append(tag) return all_tags_list @classmethod def get_recently_articles(cls, num): """ A simple classmethod. Use Article.get_recently_articles(RECENTLY_ARTICLES_NUM) to get recently(RECENTLY_ARTICLES_NUM) articles. """ return cls.objects.values('title', 'view_times', 'update_time', 'author')\ .filter(status=0).order_by('-update_time')[:num] @classmethod def get_hots_articles(cls, num): """ A simple classmethod. Use Article.get_hots_articles(HOT_ARTICLES_NUM) to get hot(HOT_ARTICLES_NUM) articles. """ return cls.objects.values('id', 'title', 'view_times', 'update_time', 'author').\ filter(status=0).order_by('-view_times' )[:num] class Meta: ordering = ['-is_top', '-update_time', '-create_time'] verbose_name_plural = verbose_name = _(u"Article")