2 from datetime import datetime
3 from django.conf import settings
4 from django.contrib.sites.models import Site
5 from django.core.mail import EmailMultiAlternatives
6 from django.db import models
7 from django.template import loader, Context
8 from django.utils.translation import ugettext_lazy as _
9 from markupfield.fields import MarkupField
10 from taggit.models import TagBase, GenericTaggedItemBase
11 from taggit_autosuggest.managers import TaggableManager
12 from slugify import slugify
15 class TagCategory(models.Model):
16 name = models.CharField(verbose_name=_('Name'), unique = True, max_length = 100)
17 slug = models.SlugField(verbose_name=_('Slug'), unique = True, max_length = 100)
20 verbose_name = _("Tag Category")
21 verbose_name_plural = _("Tag Categories")
23 def __unicode__(self):
28 def slugify(self, tag, i=None):
34 category = models.ForeignKey(TagCategory, blank = True, null = True, on_delete = models.SET_NULL, related_name = 'tags')
35 click_count = models.IntegerField(null = False, default = 0)
38 verbose_name = _("Tag")
39 verbose_name_plural = _("Tags")
42 class TagItem(GenericTaggedItemBase):
43 tag = models.ForeignKey(Tag, related_name="items")
46 class Question(models.Model):
47 email = models.EmailField(_('contact e-mail'), null=True, blank=True)
48 question = models.TextField(_('question'), db_index=False)
49 created_at = models.DateTimeField(_('created at'), auto_now_add=True)
50 changed_at = models.DateTimeField(_('changed at'), auto_now=True)
51 approved = models.BooleanField(_('approved'), default=False)
52 edited_question = models.TextField(_('edited question'), db_index=False, null=True, blank=True,
53 help_text=_("Leave empty if question doesn't need editing."))
54 answer = MarkupField(_('answer'), markup_type='textile_pl', blank=True,
55 help_text=_('Use <a href="http://txstyle.org/">Textile</a> syntax.'))
56 answered_by = models.CharField(_('answered by'), max_length=127, null=True, blank=True)
57 answered = models.BooleanField(_('answered'), db_index=True, default=False,
58 help_text=_('Check to send the answer to user.'))
59 answered_at = models.DateTimeField(_('answered at'), null=True, blank=True, db_index=True)
60 published = models.BooleanField(_('published'), db_index=True, default=False,
61 help_text=_('Check to display answered question on site.'))
62 published_at = models.DateTimeField(_('published at'), null=True, blank=True, db_index=True)
64 tags = TaggableManager(through=TagItem, blank=True)
67 ordering = ['-created_at']
68 verbose_name = _('question')
69 verbose_name_plural = _('questions')
71 def __unicode__(self):
72 return self.edited_question or self.question
75 def get_absolute_url(self):
76 return ('questions_question', (self.pk,))
78 def notify_author(self):
81 site = Site.objects.get_current()
86 text_content = loader.get_template('questions/answered_mail.txt'
88 html_content = loader.get_template('questions/answered_mail.html'
90 msg = EmailMultiAlternatives(
91 u'Odpowiedź na Twoje pytanie w serwisie %s.' % site.domain,
92 text_content, settings.SERVER_EMAIL, [self.email])
93 msg.attach_alternative(html_content, "text/html")
99 site = Site.objects.get_current()
104 text_content = loader.get_template('questions/ack_mail.txt'
106 html_content = loader.get_template('questions/ack_mail.html'
108 msg = EmailMultiAlternatives(
109 u'Twoje pytanie zostało zarejestrowane w serwisie %s.' % site.domain,
110 text_content, settings.SERVER_EMAIL, [self.email])
111 msg.attach_alternative(html_content, "text/html")
114 def save(self, *args, **kwargs):
117 if self.answered and not self.answered_at:
119 self.answered_at = now
120 if self.published and not self.published_at:
121 self.published_at = now
122 ret = super(Question, self).save(*args, **kwargs)