class SeverityChoice(models.Model): name = models.CharField(max_length=50) color = ColorField(default='#777') def __unicode__(self): return self.name
class TypeTransaction(MetaDataTable): theme_color = ColorField(default='#FF0000')
class Petition(models.Model): NO = "no gradient" RIGHT = "to right" BOTTOM = "to bottom" BOTTOM_RIGHT = "to bottom right" BOTTOM_LEFT = "to bottom left" LINEAR_GRADIENT_CHOICES = ((NO, "no gradient"), (RIGHT, "to right"), (BOTTOM, "to bottom"), (BOTTOM_RIGHT, "to bottom right"), (BOTTOM_LEFT, "to bottom left")) MAIL = "MAIL" POST = "POST" GET = "GET" NEWSLETTER_SUBSCRIBE_METHOD_CHOICES = ((MAIL, "MAIL"), (POST, "POST"), (GET, "GET")) # Description title = models.TextField(verbose_name=ugettext_lazy("Title")) text = tinymce_models.HTMLField(blank=True) side_text = tinymce_models.HTMLField(blank=True) target = models.IntegerField(default=500) # Owner user = models.ForeignKey(PytitionUser, on_delete=models.CASCADE, null=True, blank=True) org = models.ForeignKey(Organization, on_delete=models.CASCADE, null=True, blank=True) # Colors linear_gradient_direction = models.CharField( choices=LINEAR_GRADIENT_CHOICES, max_length=15, default=NO, blank=True) gradient_from = ColorField(blank=True) gradient_to = ColorField(blank=True) bgcolor = ColorField(blank=True) footer_text = tinymce_models.HTMLField(blank=True) footer_links = tinymce_models.HTMLField(blank=True) twitter_description = models.CharField(max_length=200, blank=True) twitter_image = models.CharField(max_length=500, blank=True) has_newsletter = models.BooleanField(default=False) newsletter_subscribe_http_data = models.TextField(blank=True) newsletter_subscribe_http_mailfield = models.CharField(max_length=100, blank=True) newsletter_subscribe_http_url = models.CharField(max_length=1000, blank=True) newsletter_subscribe_mail_subject = models.CharField(max_length=1000, blank=True) newsletter_subscribe_mail_from = models.CharField(max_length=500, blank=True) newsletter_subscribe_mail_to = models.CharField(max_length=500, blank=True) newsletter_subscribe_method = models.CharField( choices=NEWSLETTER_SUBSCRIBE_METHOD_CHOICES, max_length=4, default=MAIL) newsletter_subscribe_mail_smtp_host = models.CharField(max_length=100, default='localhost', blank=True) newsletter_subscribe_mail_smtp_port = models.IntegerField(default=25, blank=True) newsletter_subscribe_mail_smtp_user = models.CharField(max_length=200, blank=True) newsletter_subscribe_mail_smtp_password = models.CharField(max_length=200, blank=True) newsletter_subscribe_mail_smtp_tls = models.BooleanField(default=False) newsletter_subscribe_mail_smtp_starttls = models.BooleanField( default=False) org_twitter_handle = models.CharField(max_length=20, blank=True) published = models.BooleanField(default=False) newsletter_text = models.CharField(max_length=1000, blank=True) sign_form_footer = models.TextField(blank=True) confirmation_email_reply = models.CharField(max_length=100, blank=True) salt = models.TextField(blank=True) paper_signatures = models.IntegerField(default=0) paper_signatures_enabled = models.BooleanField(default=False) def transfer_to(self, user=None, org=None): if user is None and org is None: raise ValueError( "You should specify either an org or a user when transferring a petition" ) if user is not None and org is not None: raise ValueError( "You cannot specify both a user and an org to transfer a petition to" ) if user: self.user = user self.org = None if org: self.org = org self.user = None self.save() def prepopulate_from_template(self, template, fields=None): if fields is None: fields = [ f.name for f in self._meta.fields if f.name not in ["id", "title", "salt", "user", "org"] ] for field in fields: if hasattr(self, field) and hasattr(template, field): template_value = getattr(template, field) if template_value is not None and template_value != "": setattr(self, field, template_value) def slugify(self): # Slugify the petition title and save it as slugname if self.slugmodel_set.count() == 0: slugtext = slugify(self.title) self.add_slug(slugtext) def add_slug(self, slugtext): # Add a slug corectly with transaction.atomic(): slugtext = slugify(slugtext) # Check if there is another similar slug for the same user/org same_slugs = SlugModel.objects.filter(slug=slugtext) if len(same_slugs) == 0: slug = SlugModel.objects.create(slug=slugtext, petition=self) else: alread_used = False for s in same_slugs: if self.owner_type == "org": if s.petition.owner_type == "org": if self.org == s.petition.org: alread_used = True else: if s.petition.owner_type == "user": if self.user == s.petition.user: alread_used = True if alread_used: raise ValueError('This slug is already used') else: slug = SlugModel.objects.create(slug=slugtext, petition=self) def del_slug(self, slug): # Delete a given slug s = SlugModel.objects.filter(slug=slug, petition=self).first() s.delete() @classmethod def by_id(cls, id): try: return Petition.objects.get(pk=id) except Petition.DoesNotExist: return None def get_signature_number(self, confirmed=None): signatures = self.signature_set if confirmed is not None: signatures = signatures.filter(confirmed=confirmed) nb_electronic_signatures = signatures.count() if self.paper_signatures_enabled: return nb_electronic_signatures + self.paper_signatures else: return nb_electronic_signatures def already_signed(self, email): signature_number = Signature.objects.filter(petition = self.id)\ .filter(confirmed = True).filter(email = email).count() return signature_number > 0 def confirm_signature(self, conf_hash): signature = Signature.objects.filter(petition=self.id).get( confirmation_hash=conf_hash) if signature: # Now confirm the signature corresponding to this hash signature.confirm() signature.save() return _("Thank you for confirming your signature!") else: return None def publish(self): self.published = True self.save() def unpublish(self): self.published = False self.save() @property def to_json(self): return { 'title': self.title, 'signatures': self.get_signature_number(True), 'text': self.text, 'target': self.target, 'description': self.twitter_description, 'image': self.twitter_image, 'org_twitter_handle': self.org_twitter_handle, 'has_newsletter': self.has_newsletter, 'creator': self.owner_name } @property def owner_type(self): if self.org: return "org" else: return "user" @property def owner_name(self): return str(self.owner) @property def owner(self): if self.org: return self.org else: return self.user @property def signature_number(self): return self.get_signature_number(True) @property def raw_twitter_description(self): return html.unescape( mark_safe(strip_tags(sanitize_html(self.twitter_description)))) @property def raw_text(self): return html.unescape(mark_safe(strip_tags(sanitize_html(self.text)))) def __str__(self): return self.title def __repr__(self): return self.title def is_allowed_to_edit(self, user): """ Check if a user is allowed to edit this petition """ if self.owner_type == "user": if self.user == user: # The user is the owner of the petition return True else: return False else: # But it is an org petition try: perm = Permission.objects.get(organization=self.org, user=user) except Permission.DoesNotExist: # No such permission, denied return False else: return perm.can_modify_petitions @property def url(self): slugs = self.slugmodel_set.all() if len(slugs) == 0: # If there is no slug, ugly url return reverse('detail', kwargs={'petition_id': self.id}) else: if self.owner_type == "org": # This petition is owned by an Organization return reverse("slug_show_petition", kwargs={ "orgslugname": self.org.slugname, "petitionname": slugs[0] }) elif self.owner_type == "user": # This petition is owned by a PytitionUser return reverse("slug_show_petition", kwargs={ "username": self.user.username, "petitionname": slugs[0] }) else: # This is a BUG! raise ValueError( _("This petition is buggy. Sorry about that!")) def save(self, *args, **kwargs): if (self.org is None and self.user is None): raise Exception("You need to provide a user or org as owner") elif (self.org is not None and self.user is not None): raise Exception("A petition can have only one owner") else: if not self.salt: hasher = get_hasher() self.salt = hasher.salt().decode('utf-8') super(Petition, self).save(*args, **kwargs)
class CustomTheme(models.Model): name = models.CharField(max_length=100, help_text='Will not appear anywhere') description = models.TextField(null=True, help_text='Will not appear anywhere', blank=True) site_name = models.CharField(max_length=100, blank=True, default='', help_text='The name of the site') logo = models.ImageField(upload_to='site_logo', null=True, blank=True) landing_page_sections = models.ManyToManyField( 'bims_theme.LandingPageSection', null=True, blank=True, help_text='Landing page sections') carousels = models.ManyToManyField( 'bims_theme.CarouselHeader', null=True, blank=True, help_text='Carousels that will appear on the landing page') partners = models.ManyToManyField( 'bims_theme.Partner', null=True, blank=True, help_text='List of partners that will appear on the landing page') menu_items = models.ManyToManyField('bims_theme.MenuItem', null=True, blank=True, help_text='Extra menu items') date = models.DateTimeField(auto_now_add=True, blank=True) main_accent_color = ColorField(default='#18A090') secondary_accent_color = ColorField(default='#DBAF00') main_button_text_color = ColorField(default='#FFFFFF') navbar_background_color = ColorField(default='#343a40') navbar_text_color = ColorField(default='#FFFFFF') is_enabled = models.BooleanField(default=True) is_footer_enabled = models.BooleanField(default=False) facebook_link = models.URLField(blank=True, default='', help_text='To be displayed in the footer') twitter_link = models.URLField(blank=True, default='', help_text='To be displayed in the footer') instagram_link = models.URLField(blank=True, default='', help_text='To be displayed in the footer') email_1 = models.CharField(max_length=200, blank=True, default='', help_text='To be displayed in the footer') email_2 = models.CharField(max_length=200, blank=True, default='', help_text='To be displayed in the footer') phone_1 = models.CharField(max_length=200, blank=True, default='', help_text='To be displayed in the footer') phone_2 = models.CharField(max_length=200, blank=True, default='', help_text='To be displayed in the footer') address_1 = models.TextField(blank=True, default='', help_text='To be displayed in the footer') address_2 = models.TextField(blank=True, default='', help_text='To be displayed in the footer') class Meta: ordering = ("date", ) verbose_name_plural = 'Custom Themes' def __str__(self): return self.name
class PetitionTemplate(models.Model): NO = "no gradient" RIGHT = "to right" BOTTOM = "to bottom" BOTTOM_RIGHT = "to bottom right" BOTTOM_LEFT = "to bottom left" LINEAR_GRADIENT_CHOICES = ((NO, "no gradient"), (RIGHT, "to right"), (BOTTOM, "to bottom"), (BOTTOM_RIGHT, "to bottom right"), (BOTTOM_LEFT, "to bottom left")) MAIL = "MAIL" POST = "POST" GET = "GET" NEWSLETTER_SUBSCRIBE_METHOD_CHOICES = ((MAIL, "MAIL"), (POST, "POST"), (GET, "GET")) name = models.CharField(max_length=50, verbose_name=ugettext_lazy("Name"), db_index=True) text = tinymce_models.HTMLField(blank=True) side_text = tinymce_models.HTMLField(blank=True) target = models.IntegerField(blank=True, null=True) linear_gradient_direction = models.CharField( choices=LINEAR_GRADIENT_CHOICES, max_length=15, default=NO, blank=True) gradient_from = ColorField(blank=True) gradient_to = ColorField(blank=True) bgcolor = ColorField(blank=True) footer_text = tinymce_models.HTMLField(blank=True) footer_links = tinymce_models.HTMLField(blank=True) twitter_description = models.CharField(max_length=200, blank=True) twitter_image = models.CharField(max_length=500, blank=True) has_newsletter = models.BooleanField(default=False) newsletter_subscribe_http_data = models.TextField(blank=True) newsletter_subscribe_http_mailfield = models.CharField(max_length=100, blank=True) newsletter_subscribe_http_url = models.CharField(max_length=1000, blank=True) newsletter_subscribe_mail_subject = models.CharField(max_length=1000, blank=True) newsletter_subscribe_mail_from = models.EmailField(max_length=500, blank=True) newsletter_subscribe_mail_to = models.EmailField(max_length=500, blank=True) newsletter_subscribe_method = models.CharField( choices=NEWSLETTER_SUBSCRIBE_METHOD_CHOICES, max_length=4, default=MAIL) newsletter_subscribe_mail_smtp_host = models.CharField(max_length=100, default='localhost', blank=True) newsletter_subscribe_mail_smtp_port = models.IntegerField(default=25) newsletter_subscribe_mail_smtp_user = models.CharField(max_length=200, blank=True) newsletter_subscribe_mail_smtp_password = models.CharField(max_length=200, blank=True) newsletter_subscribe_mail_smtp_tls = models.BooleanField(default=False) newsletter_subscribe_mail_smtp_starttls = models.BooleanField( default=False) org_twitter_handle = models.CharField(max_length=20, blank=True) newsletter_text = models.CharField(max_length=1000, blank=True) sign_form_footer = models.TextField(blank=True) confirmation_email_sender = models.EmailField(max_length=100, blank=True) confirmation_email_smtp_host = models.CharField(max_length=100, default='localhost', blank=True) confirmation_email_smtp_port = models.IntegerField(default=25, blank=True) confirmation_email_smtp_user = models.CharField(max_length=200, blank=True) confirmation_email_smtp_password = models.CharField(max_length=200, blank=True) confirmation_email_smtp_tls = models.BooleanField(default=False) confirmation_email_smtp_starttls = models.BooleanField(default=False) use_custom_email_settings = models.BooleanField(default=False) def __str__(self): return self.name def __repr__(self): return self.name class Meta: index_together = [ "id", ]
class PageBlock(models.Model): PAGE_BLOCK_TYPE = ( (0, 'careers_wrapper'), # (1, 'careers_item'), (1, 'news_wrapper'), (2, 'contact_wrapper' ), # No block, just display info in header right side (3, 'company_wrapper' ), # No block, just display info in header right side (4, 'second_wrapper'), # use nested blocks (5, 'sector_wrapper'), # use nested blocks (6, 'project_wrapper'), (7, 'cripto_wrapper'), (8, 'team_wrapper'), (9, 'benefit_wrapper'), # (11, 'benefit_item'), (10, 'investor_wrapper'), # (13, 'investor_item'), ( 11, 'nested_block' ), # use nested block and render like benefit/careers/investor/second/cripto item ) block_type = models.IntegerField(_(u'Тип блока'), choices=PAGE_BLOCK_TYPE, blank=True, null=True) nested_block = models.ForeignKey(verbose_name=_(u'Вложенный блок'), to='self', on_delete=models.SET_NULL, blank=True, null=True) page_object = models.ForeignKey(verbose_name=_(u'Для страницы'), to=Page, on_delete=models.SET_NULL, blank=True, null=True) title = models.CharField(_(u'Заголовок'), max_length=40) title_color = ColorField(_(u'Цвет заголовка'), default='#07187b') subtitle = models.CharField(_(u'Подзаголовок'), max_length=100, blank=True, null=True) text = RichTextField(_(u'Текст'), blank=True, null=True) background_image = models.ImageField(_(u'Фоновое изображение'), upload_to=image_path, blank=True, null=True) use_slider = models.BooleanField(_(u'Использовать слайдер'), default=False) publish = models.BooleanField(_(u'Публиковать'), default=False) position = models.PositiveIntegerField(_(u'Позиция'), default=0, blank=True, null=True) objects = PageBlockManager() class Meta: ordering = ['position'] verbose_name = _(u'Блок страницы') verbose_name_plural = _(u'Блоки страницы') def children(self): """ Child pages. Ex. blog pages on blog list page. """ return PageBlock.objects.filter(nested_block=self, publish=True) def is_published(self): return self.publish is_published.admin_order_field = 'publish' is_published.boolean = True is_published.short_description = _(u'Опубликовано?')
class UserQuotes(models.Model): quote_id = models.CharField("Your Quote ID", max_length=50, editable=False) author = models.ForeignKey(User, on_delete=models.CASCADE, editable=False) quote_image = models.ImageField( "Select Quote Image", null=True, blank=True, help_text= "If you skip this we will add our image ..! Image size should be 500 height and 300 width", upload_to="quotes_image/") content = models.TextField( 'Write Your Quote Text', help_text= 'You can skip this if you have image with quote text ..! Note: This text will be shown with your selected image', null=True, blank=True) text_color = ColorField("Choose Text Color", default='#FF0000') view_on_website = models.URLField( "Copy below links in browser to view quote Content", null=True, blank=True, max_length=255, editable=False) total_hits = models.BigIntegerField('Total hits for this poem', default=0, editable=False) verified_content = models.BooleanField(default=True, editable=False) NOTIFICATION_CHOICES = ( ('ON', 'ON'), ('OFF', 'OFF'), ) notification = models.CharField('Allow Notification for this Quote', max_length=10, choices=NOTIFICATION_CHOICES, default='ON') PUBLISHED_CONTENT_CHOICES = ( ('YES', 'Yes'), ('NO', 'No'), ) published_content = models.CharField( 'Can We Publish This Quote?', help_text= "Note: We will not added this quote in your quote list untill you will not select Yes ..!! Important:=> if you published your quote content once then you will not able to change quote content as well delete. For more info you can go through WC Terms & Conditions", max_length=10, choices=PUBLISHED_CONTENT_CHOICES, default='NO') coming_soon = models.CharField(max_length=50, null=True, blank=True, editable=False) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(null=True, blank=True, editable=False) def __str__(self): return str(self.id) class Meta: verbose_name_plural = 'Add Quotes'
class MapColorScheme(models.Model): """ Available Color Palette for STVs """ color = ColorField(default="#F7F7F7", unique=True) palette = models.TextField(max_length=64, blank=True, null=True) main = models.BooleanField(default=False, blank=True)
class Product(HashIdMixin, SlugMixin, AllowedListAccessMixin, TranslatableModel): SLDS_ICON_CHOICES = ( ("", ""), ("action", "action"), ("custom", "custom"), ("doctype", "doctype"), ("standard", "standard"), ("utility", "utility"), ) class Meta: ordering = ("category__order_key", "order_key") objects = ProductQuerySet.as_manager() translations = TranslatedFields( title=models.CharField(max_length=256), short_description=models.TextField(blank=True), description=MarkdownField(property_suffix="_markdown", blank=True), click_through_agreement=MarkdownField(blank=True, property_suffix="_markdown"), ) @property def description_markdown(self): return self.get_translation("en-us").description_markdown @property def click_through_agreement_markdown(self): return self.get_translation("en-us").click_through_agreement_markdown category = models.ForeignKey(ProductCategory, on_delete=models.PROTECT) color = ColorField(blank=True) image = models.ImageField(blank=True) icon_url = models.URLField( blank=True, help_text=_( "This will take precedence over Color and the SLDS Icons."), ) slds_icon_category = models.CharField(choices=SLDS_ICON_CHOICES, default="", blank=True, max_length=32) slds_icon_name = models.CharField(max_length=64, blank=True) repo_url = models.URLField(blank=True) is_listed = models.BooleanField(default=True) order_key = models.PositiveIntegerField(default=0) slug_class = ProductSlug @property def slug_queryset(self): return self.productslug_set def __str__(self): return self.title @property def most_recent_version(self): return self.version_set.exclude( is_listed=False).order_by("-created_at").first() @property def icon(self): if self.icon_url: return {"type": "url", "url": self.icon_url} if self.slds_icon_name and self.slds_icon_category: return { "type": "slds", "category": self.slds_icon_category, "name": self.slds_icon_name, } return None
class Interface(Preferences): ON_OVER = 0 ON_CLICK = 1 BOOKING_TOOLTIP_CHOICES = ( (ON_OVER, 'при наведении'), (ON_CLICK, 'при нажатии'), ) NOT = 0 RELATIVE = 1 ACTUAL = 2 PAYED_LAYER_CHOICES = ( (NOT, 'нет'), (RELATIVE, 'относительный период'), (ACTUAL, 'фактический период'), ) ON_CATEGORIES = 0 NO_GROUP = 1 ON_FLOORS = 2 ON_CASES = 3 ROOM_GROUP_CHOICES = ( (ON_CATEGORIES, 'по категориям'), (ON_FLOORS, 'по этажам'), (ON_CASES, 'по корпусам'), (NO_GROUP, 'не группировать'), ) booking_popup = models.BooleanField('открывать брони в отдельном окне', default=False) clean_mode = models.BooleanField('отображать статус уборки номера', default=True) booking_offset = models.BooleanField('смещать полоску бронирования на половину суток', default=True) show_calendar_foot = models.BooleanField('дублировать даты внизу шахматки', default=True) show_extra_data = models.BooleanField( 'отображать дополнительные данные клиента на полоске бронирования', default=False ) show_client_comment = models.BooleanField('отображать пожелания клиента в окне информации о брони', default=True) room_name_fixed = models.BooleanField('фиксировать названия номеров при горизонтальной прокрутке', default=True) not_payed_info = models.BooleanField( 'помечать неоплаченные брони (для статусов "Проживание" и "Выезд")', default=True ) comment_info = models.BooleanField('помечать брони с комментарием', default=True) audio_notify = models.BooleanField('включить звуковые уведомления', default=True) auto_price = models.BooleanField( 'автоматически подставлять цену в поле "К оплате" при создании брони', default=True ) auto_edit_price = models.BooleanField( 'автоматически обновлять цену в поле "К оплате" при изменении брони', default=True ) check_bl = models.BooleanField('автоматически проверять клиента по черному списку', default=True) support = models.BooleanField('включить онлайн-консультант', default=False) booking_tooltip = models.PositiveSmallIntegerField( 'Показывать всплывающее окно с информацией о брони', default=ON_CLICK, choices=BOOKING_TOOLTIP_CHOICES ) payed_layer = models.PositiveSmallIntegerField( 'Выделять цветом период оплаты брони', default=ACTUAL, choices=PAYED_LAYER_CHOICES ) payed_layer_stripe = models.BooleanField( 'использовать штриховку', default=False ) payed_layer_status = models.ManyToManyField( 'Status', verbose_name='Выделять цветом период оплаты брони для статусов' ) room_group = models.PositiveSmallIntegerField( 'Группировать номера в шахматке', default=ON_CATEGORIES, choices=ROOM_GROUP_CHOICES ) today_color = ColorField(default='#4ec8ea', verbose_name='Цвет линии текущего дня') payed_layer_color = ColorField(default='#009f1a', verbose_name='Цвет оплаченного периода на полоске бронирования') room_closed_color = ColorField(default='#7c7878', verbose_name='Цвет периода закрытого на ремонт номера') class Meta: verbose_name = _('Interface setting') verbose_name_plural = _('Interface settings')
class ColorTag(models.Model): class Meta: abstract = True ordering = ['slug'] name = models.CharField(max_length=MAX_LENGTH, help_text=_("Display name for tag")) slug = models.SlugField(max_length=MAX_LENGTH, help_text=_("Slug key for tag. If left blank, one is created from name")) description = models.CharField(max_length=155, blank=True, help_text=_("Describe the usage or meaning of this tag")) color = ColorField(default="#CD0000", help_text=_("Color that is used as background for this tag")) @cached_property def font_white(self): return use_white_font(self.color) @cached_property def font_color(self): return '#FFF' if self.font_white else '#000' def render_as_button(self, **options): return render_as_button(self, options) @cached_property def html_button(self): return render_as_button(self) @cached_property def html_label(self): return render_as_button(self, {'static': True}) def __str__(self): return 'ColorTag({!r}, {!r}, {!r})'.format( self.name, self.slug, self.description ) def __eq__(self, other): """Compare slugs if other is a string. Otherwise delegate to super""" if isinstance(other, str): return self.slug == other return super().__eq__(other) def __gt__(self, other): """Compare ColorTags by slug""" if isinstance(other, ColorTag): return self.slug > other.slug return NotImplemented # Check django issue 30333: https://code.djangoproject.com/ticket/30333 __hash__ = models.Model.__hash__ def is_valid_slug(self, slug): """ Check if the slug is valid. By default any slug is valid; you might want to override e.g. to implement uniqueness checks """ return True def save(self, *args, **kwargs): assert self.name, "name is a required parameter" slug_candidate = self.slug or slugify(self.name) slug_chars = string.ascii_lowercase + string.digits while not self.is_valid_slug(slug_candidate) and len(slug_candidate) < MAX_LENGTH: slug_candidate += get_random_string(length=1, allowed_chars=slug_chars) if len(slug_candidate) >= MAX_LENGTH: raise RuntimeError("Unable to find an unique slug") self.slug = slug_candidate return super().save(*args, **kwargs)
class FrontendSettings(ModelUpdateMixin, SingletonModel): """ Singleton model restricted by django-solo plugin. Settings for this application only. """ merge_electricity_tariffs = models.BooleanField( default=False, verbose_name=_('Merge electricity tariffs'), help_text= _('Whether you are using a single electricity tariff and both (high/low) should be displayed merged' )) electricity_delivered_color = ColorField( default='#F05050', verbose_name=_('Electricity delivered color'), help_text=_( "Graph color for electricity delivered (default + high tariff)")) electricity_delivered_alternate_color = ColorField( default='#7D311A', verbose_name=_('Electricity delivered color (alternative)'), help_text=_("Graph color for electricity delivered (low tariff)")) electricity_returned_color = ColorField( default='#27C24C', verbose_name=_('Electricity returned color'), help_text=_( "Graph color for electricity returned (default + high tariff)")) electricity_returned_alternate_color = ColorField( default='#C8C864', verbose_name=_('Electricity returned color (alternative)'), help_text=_("Graph color for electricity returned (low tariff)")) gas_delivered_color = ColorField( default='#FF851B', verbose_name=_('Gas delivered color'), help_text=_("Graph color for gas delivered")) phase_delivered_l1_color = ColorField( default='#A47448', verbose_name=_('Phase L1+ (delivered) color'), help_text=_("Graph color for phase L1+")) phase_delivered_l2_color = ColorField( default='#A4484E', verbose_name=_('Phase L2+ (delivered) color'), help_text=_("Graph color for phase L2+ (when available)")) phase_delivered_l3_color = ColorField( default='#A44882', verbose_name=_('Phase L3+ (delivered) color'), help_text=_("Graph color for phase L3+ (when available)")) phase_returned_l1_color = ColorField( default='#2E7D32', verbose_name=_('Phase L1- (returned) color'), help_text=_("Graph color for phase L1-")) phase_returned_l2_color = ColorField( default='#8BC34A', verbose_name=_('Phase L2- (returned) color'), help_text=_("Graph color for phase L2- (when available)")) phase_returned_l3_color = ColorField( default='#9E9D24', verbose_name=_('Phase L3- (returned) color'), help_text=_("Graph color for phase L3- (when available)")) temperature_color = ColorField( default='#0073B7', verbose_name=_('Temperature color'), help_text=_("Graph color for temperatures read")) dashboard_graph_width = models.IntegerField( default=30, validators=[MinValueValidator(30), MaxValueValidator(120)], verbose_name=_('Dashboard graph width'), help_text= _("The number of items displayed on the X-axis of the dashboard graphs" )) def __str__(self): return self._meta.verbose_name.title() class Meta: default_permissions = tuple() verbose_name = _('Frontend configuration')
class Profile(models.Model): user = models.OneToOneField(get_user_model(), on_delete=models.CASCADE) color = ColorField(default=random_color) def __str__(self): return self.user.username
class Zone(models.Model): SCORE_LOG = 1 SCORE_EXP = 2 SCORE_LIN = 3 SCORE_BONUS = 4 ZONE_SCORING_CHOICES = [ (SCORE_LOG, "Multe puncte la început, tot mai puține apoi"), (SCORE_EXP, "Putine puncte la început, tot mai multe apoi"), (SCORE_LIN, "Puncte proportional cu posesia"), (SCORE_BONUS, "Putine punct la început, tot mai multe apoi (bonus)") ] name = models.CharField(max_length=255) color = ColorField(default="#000000", max_length=18) scoring_type = models.PositiveSmallIntegerField( choices=ZONE_SCORING_CHOICES) shape = models.PolygonField(null=True, blank=True) def __str__(self): return self.name def zone_control(self, category): teams = self.teamzoneownership_set.filter( team__category=category, timestamp_end__isnull=True).values_list('team', flat=True) # return Team.objects.filter(pk__in=teams) return teams def assign_to_team(self, team, handover_time=None): if not handover_time: handover_time = datetime.now(timezone.utc) try: current_ownership = TeamZoneOwnership.objects.get( zone=self, timestamp_end__isnull=True, team__category=team.category) current_ownership.timestamp_end = handover_time current_ownership.save() current_ownership.team.update_score(current_ownership) except TeamZoneOwnership.DoesNotExist: pass TeamZoneOwnership.objects.create(zone=self, team=team, timestamp_start=handover_time) def _get_score_exp(self, seconds): mins = seconds / 60. return math.pow(mins, 2) / 140 + 10 def _get_score_exp_bonus(self, seconds): mins = seconds / 60. return min(math.pow(mins, 2) / 25 + 50, 200) def _get_score_log(self, seconds): mins = seconds / 60. return 30 * math.log(mins) + pow(mins, 2) / 10000 def _get_score_prop(self, seconds): mins = seconds / 60. return mins def get_score(self, seconds): score_functions = { Zone.SCORE_EXP: self._get_score_exp, Zone.SCORE_LOG: self._get_score_log, Zone.SCORE_LIN: self._get_score_prop, Zone.SCORE_BONUS: self._get_score_exp_bonus, } return score_functions[self.scoring_type](seconds)
class MemeTemplate(MemeImage): class Meta: verbose_name = "Template" indexes = [ models.Index(fields=['friendly_name'], name='idx_template_fname'), models.Index(fields=['add_date'], name='idx_template_adddate'), models.Index(fields=['change_date'], name='idx_template_chdate'), ] bg_image_file = models.ImageField(upload_to='templates/', max_length=256, null=True, default=None, blank=True, verbose_name="Background") image_file = models.ImageField(upload_to='templates/', max_length=256, null=True, default=None, blank=True, verbose_name="Overlay") bg_color = ColorField(default='', blank=True, verbose_name='Background color') image_type = IMAGE_TYPE_TEMPLATE def clean(self): if not self.bg_image_file and not self.image_file: raise ValidationError( 'Please upload a template background and/or overlay image', code='missing_image') if self.bg_image_file and self.image_file and ( self.bg_image_file.width != self.image_file.width or self.bg_image_file.height != self.image_file.height): raise ValidationError( 'The background and overlay images have to have the same dimensions', code='mismatched_dimensions') if self.image_pool.pool_type not in [ POOL_TYPE_TEMPLATES, POOL_TYPE_ALL ]: raise ValidationError('Not a template pool: %(pool)s', params={'pool': self.image_pool}, code='invalid_pool') super(MemeTemplate, self).clean() self.change_date = timezone.now() @classmethod def find(cls, image_pools=None, name=None, allow_disabled=False): obj = cls.objects if not allow_disabled: obj = obj.filter(accepted=True) if image_pools is not None: obj = obj.filter(image_pool__in=image_pools) found = \ obj.filter(name__iexact=name).first() or \ obj.filter(friendly_name__iexact=name).first() or \ obj.filter(name__istartswith=name).first() or \ obj.filter(friendly_name__istartswith=name).first() or \ obj.filter(name__icontains=name).first() or \ obj.filter(friendly_name__icontains=name).first() if found is not None: return found name_words = re.split('[ ./]', name) found = \ obj.filter(reduce(operator.and_, (Q(name__icontains=x) for x in name_words))).first() or \ obj.filter(reduce(operator.and_, (Q(friendly_name__icontains=x) for x in name_words))).first() return found def slot(self, slot_id): return MemeTemplateSlot.objects.filter(template=self, slot_order=slot_id) @property def preview_url(self): return self.pk and reverse('website:meme_preview_template', kwargs={'template': self.name }) + '?pools=halflife' or '' @property def image_url(self): return self.image_file and self.image_file.url or '' @property def bgimage_url(self): return self.bg_image_file and self.bg_image_file.url or ''
class Area(models.Model): name = models.CharField(max_length=1000, null=False, blank=False) description = models.TextField(null=False, default='', blank=True) points_json = models.TextField(null=False, default='', blank=True) color = ColorField(null=True, blank=True) tile_indexes = models.TextField(null=False, default='', blank=True)
class Games(models.Model): # Пользователь, связывает с моделью User. user = models.ForeignKey(Users, verbose_name="user", on_delete=models.CASCADE) # Общее время игры total_game_time = models.CharField(verbose_name="total time", max_length=10, default="00:00:00") # Включена ли пауза, включена - True, выключена - False. pause = models.BooleanField(verbose_name="pause", default=True) # Состояние хода, идет - true, закончился - false turn_run = models.BooleanField(verbose_name="turn run", default=False) # Цвет активного игрока active = ColorField(verbose_name="active") # default = '#FF0000' def __str__(self): return "ID = {0}\nTotal time = {1}".format(self.id, self.total_game_time) def get_id(self): return self.id def get_user(self): return self.user_id def get_total_time(self): return self.total_game_time def set_total_time(self, total_game_time): self.total_game_time = total_game_time self.save(update_fields=['total_game_time']) def get_pause(self): return self.pause def set_pause(self, pause): self.pause = pause self.save(update_fields=['pause']) def get_turn_run(self): return self.turn_run def set_turn_run(self, turn_run): self.turn_run = turn_run self.save(update_fields=['turn_run']) def get_active(self): return self.active.lower() def set_active(self, active): self.active = active.lower() self.save(update_fields=['active']) def get_game_JSON(self): return { "id": self.id, "user": self.user_id, "total_game_time": self.total_game_time } def new_game_JSON(self, user_JSON, active_player): user_id = user_JSON["user_id"] user = Users.objects.get(user_id=user_id) game = Games(user=user, active=active_player) game.save() return game.get_game_JSON() def new_game_JSON_get_id(self, user_JSON, active_player): user_id = user_JSON["user_id"] user = Users.objects.get(user_id=user_id) game = Games(user=user, active=active_player) game.save() return {"id": game.id} def get_total_time_for_web_api(self): total_time = self.total_game_time.split(':') return {'h': total_time[0], 'm': total_time[1], 's': total_time[2]}
class Track(models.Model): class Type(DjangoChoices): car = ChoiceItem(1) bicycle = ChoiceItem(2) walk = ChoiceItem(3) other = ChoiceItem(4) mushroom = ChoiceItem(5) class Status(DjangoChoices): done = ChoiceItem(1) planned = ChoiceItem(2) name = models.CharField(max_length=1000, null=False, blank=False) description = models.TextField(null=False, default='', blank=True) points_json = models.TextField(null=False, default='', blank=True) points_json_optimized = models.TextField(null=False, default='', blank=True) color = ColorField(null=True, blank=True) start_time = models.DateTimeField(null=True, blank=True, db_index=True) end_time = models.DateTimeField(null=True, blank=True) distance = models.IntegerField(null=False) status = models.IntegerField(null=False, blank=False) type = models.IntegerField(null=False, blank=False) region = models.ForeignKey(Region, on_delete=models.SET_NULL, null=True, blank=True) gpx_file = models.TextField(null=False, default='', blank=True) upload_user = models.ForeignKey(User, null=True, blank=True, on_delete=models.SET_NULL) def get_points_json_counts(self): segments = 0 points = 0 for segment in json.loads(self.points_json): segments = segments + 1 points = points + len(segment) return "Segments: {}, Points: {}".format(segments, points) def get_points_json_optimized_counts(self): segments = 0 points = 0 for segment in json.loads(self.points_json_optimized): segments = segments + 1 points = points + len(segment) return "Segments: {}, Points: {}".format(segments, points) get_points_json_counts.short_description = 'points json' get_points_json_optimized_counts.short_description = 'points json optimized' def get_gpx_file_counts(self): segments = 0 points = 0 if self.gpx_file: gpx = gpxpy.parse(self.gpx_file) for track in gpx.tracks: for segment in track.segments: segments = segments + 1 points = points + len(segment.points) return "Segments: {}, Points: {}".format(segments, points) else: return 'No file' get_gpx_file_counts.short_description = 'gpx file' def calculate_distance_from_segments(self): return calculate_distance_from_segments(json.loads(self.points_json)) def calculate_distance_from_segments_optimized(self): return calculate_distance_from_segments( json.loads(self.points_json_optimized))
class Theme(models.Model): @staticmethod def post_migrate_handler(sender, **kwargs): Theme.get_or_create_default_theme() @staticmethod def post_delete_handler(instance, **kwargs): Theme.get_or_create_default_theme() @staticmethod def post_save_handler(instance, created, **kwargs): instance.set_active(instance.active) Theme.get_or_create_default_theme() @staticmethod def get_or_create_default_theme(): obj_active = (True if len(list(Theme.objects.filter( active=True))) == 0 else False) obj, obj_created = Theme.objects.get_or_create( pk='1', defaults={'active': obj_active}) if not obj.logo: obj.set_default_logo() if not obj_created and obj_active: obj.set_active(True) return ( obj, obj_created, ) name = models.CharField(max_length=50, default='Django') active = models.BooleanField(default=True) title = models.CharField(max_length=50, default='Django administration', blank=True) title_visible = models.BooleanField(default=True, verbose_name='visible') logo = models.FileField(upload_to='admin-interface/logo/', blank=True) logo_visible = models.BooleanField(default=True, verbose_name='visible') css_header_background_color = ColorField(blank=True, default='#0C4B33', help_text='#0C4B33', verbose_name='background color') css_header_title_color = ColorField(blank=True, default='#F5DD5D', help_text='#F5DD5D', verbose_name='title color') css_header_text_color = ColorField(blank=True, default='#44B78B', help_text='#44B78B', verbose_name='text color') css_header_link_color = ColorField(blank=True, default='#FFFFFF', help_text='#FFFFFF', verbose_name='link color') css_header_link_hover_color = ColorField(blank=True, default='#C9F0DD', help_text='#C9F0DD', verbose_name='link hover color') css_module_background_color = ColorField(blank=True, default='#44B78B', help_text='#44B78B', verbose_name='background color') css_module_text_color = ColorField(blank=True, default='#FFFFFF', help_text='#FFFFFF', verbose_name='text color') css_module_link_color = ColorField(blank=True, default='#FFFFFF', help_text='#FFFFFF', verbose_name='link color') css_module_link_hover_color = ColorField(blank=True, default='#C9F0DD', help_text='#C9F0DD', verbose_name='link hover color') css_module_rounded_corners = models.BooleanField( default=True, verbose_name='rounded corners') css_generic_link_color = ColorField(blank=True, default='#0C3C26', help_text='#0C3C26', verbose_name='link color') css_generic_link_hover_color = ColorField(blank=True, default='#156641', help_text='#156641', verbose_name='link hover color') css_save_button_background_color = ColorField( blank=True, default='#0C4B33', help_text='#0C4B33', verbose_name='background color') css_save_button_background_hover_color = ColorField( blank=True, default='#0C3C26', help_text='#0C3C26', verbose_name='background hover color') css_save_button_text_color = ColorField(blank=True, default='#FFFFFF', help_text='#FFFFFF', verbose_name='text color') css_delete_button_background_color = ColorField( blank=True, default='#BA2121', help_text='#BA2121', verbose_name='background color') css_delete_button_background_hover_color = ColorField( blank=True, default='#A41515', help_text='#A41515', verbose_name='background hover color') css_delete_button_text_color = ColorField(blank=True, default='#FFFFFF', help_text='#FFFFFF', verbose_name='text color') css = models.TextField(blank=True) list_filter_dropdown = models.BooleanField(default=False) def set_active(self, value): if value: Theme.objects.exclude(pk=self.pk).update(active=False) Theme.objects.filter(pk=self.pk).update(active=True) else: Theme.objects.filter(pk=self.pk).update(active=False) def set_default_logo(self): logo_filename = 'logo-django.svg' logo_path = os.path.normpath( os.path.dirname(__file__) + '/data/' + logo_filename) logo_file = open(logo_path) self.logo = File(logo_file, logo_filename) self.save() logo_file.close() class Meta: app_label = 'admin_interface' verbose_name = 'Theme' verbose_name_plural = 'Themes' def __unicode__(self): return unicode(u'%s' % (self.name, ))
class Car(models.Model): title = models.CharField(max_length=200, null=True) price = models.FloatField() image = models.ImageField(upload_to='cars/') description = models.TextField(null=True, blank=False) views = models.PositiveIntegerField(default=0) featured = models.PositiveIntegerField(default=0) created_at = models.DateTimeField(auto_now_add=True) slug = AutoSlugField(populate_from='title', unique_with='created_at__month', slugify=custom_slugify) region = models.CharField(max_length=20, choices=REGIONS_LIST, null=True, blank=True) # ####### purpose = models.CharField(max_length=4, choices=CARE_PURPOSE_TYPE, null=True, blank=True) brand = models.ForeignKey(Brand, on_delete=models.SET_NULL, null=True, blank=True, related_name='carbrands') locality = models.ForeignKey(Locality, on_delete=models.SET_NULL, null=True, blank=True, related_name='carlocality') car_type = models.ForeignKey(Type, on_delete=models.SET_NULL, null=True, blank=True, related_name='cartypes') int_color = ColorField(default="#FFFFFF", null=True, blank=True) ext_color = ColorField(default="#FFFFFF", null=True, blank=True) mileage = models.CharField(max_length=200, null=True, blank=True) fuel_type = models.CharField(max_length=6, choices=CAR_FUEL_TYPE, null=True, blank=True) gearbox = models.CharField(max_length=10, choices=CAR_GEARBOX, null=True, blank=True) drive_type = models.CharField(max_length=5, choices=CAR_DRIVE_TYPE, null=True, blank=True) car_state = models.CharField(max_length=4, choices=CAR_STATE, null=True) engine = models.CharField(max_length=200, null=True, blank=True) air_con = models.CharField(max_length=3, choices=CAR_AIR_CON, null=True, blank=True) year = models.IntegerField( _('year'), validators=[MinValueValidator(1984), max_value_current_year]) def __str__(self): return self.title @property def imageURL(self): try: url = self.image.url except: url = '' return url def get_absolute_url(self): return reverse("cars:car-detail", kwargs={'slug': self.slug}) def get_date(self): time = datetime.now() if self.created_at.day == time.day: return str(time.hour - self.created_at.hour) + " hours ago" else: if self.created_at.month == time.month: return str(time.day - self.created_at.day) + " days ago" else: if self.created_at.year == time.year: return str(time.month - self.created_at.month) + " months ago" else: return str(time.year - self.created_at.year) + " year(s) ago" return self.created_at
class SiteSettings(models.Model): site = models.OneToOneField( Site, related_name='settings', on_delete=models.CASCADE, ) header_text = models.CharField( max_length=200, blank=True, ) description = models.CharField( max_length=500, blank=True, ) top_menu = models.ForeignKey( 'menu.Menu', on_delete=models.SET_NULL, related_name='+', blank=True, null=True, ) bottom_menu = models.ForeignKey( 'menu.Menu', on_delete=models.SET_NULL, related_name='+', blank=True, null=True, ) include_taxes_in_prices = models.BooleanField( default=True, ) display_gross_prices = models.BooleanField( default=True, ) charge_taxes_on_shipping = models.BooleanField( default=True, ) track_inventory_by_default = models.BooleanField( default=True, ) homepage_collection = models.ForeignKey( 'product.Collection', on_delete=models.SET_NULL, related_name='+', blank=True, null=True, ) default_weight_unit = models.CharField( max_length=10, choices=WeightUnits.CHOICES, default=WeightUnits.KILOGRAM, ) automatic_fulfillment_digital_products = models.BooleanField( default=False, ) default_digital_max_downloads = models.IntegerField( blank=True, null=True, ) default_digital_url_valid_days = models.IntegerField( blank=True, null=True, ) # BEGIN :: SoftButterfly Extensions ---------------------------------------- # Dashboard style settings ------------------------------------------------- dashboard_logo = VersatileImageField( upload_to=site_settings_dashboard_logo_upload_to, blank=True, validators=[ FileExtensionValidator( allowed_extensions=[ 'png', ], ), ], ) dashboard_header_color = ColorField( default='#2784FF', blank=True, ) dashboard_subheader_color = ColorField( default='#4796FC', blank=True, ) dashboard_header_text_color = ColorField( default='#FFFFFF', blank=True, ) dashboard_button_color = ColorField( default='#00BCD4', blank=True, ) # Store style settings ----------------------------------------------------- store_logo = VersatileImageField( upload_to=site_settings_store_logo_upload_to, blank=True, validators=[ FileExtensionValidator( allowed_extensions=[ 'png', ], ), ], ) store_accent_color = ColorField( default='#2784FF', blank=True, ) store_header_color = ColorField( default='#2784FF', blank=True, ) store_header_text_color = ColorField( default='#FFFFFF', blank=True, ) # Storefront settings ------------------------------------------------------ store_logo = VersatileImageField( upload_to=site_settings_store_logo_upload_to, blank=True, validators=[ FileExtensionValidator( allowed_extensions=[ 'png', ], ), ], ) store_accent_color = ColorField( default='#2784FF', blank=True, ) store_header_color = ColorField( default='#2784FF', blank=True, ) store_header_text_color = ColorField( default='#FFFFFF', blank=True, ) # Store business settings -------------------------------------------------- # business_name = models.CharField( # max_length=256, # blank=True, ) # business_tax_id = models.CharField( # max_length=256, # blank=True, ) # Aditional payment settings ----------------------------------------------- cash_payment_enabled = models.BooleanField(default=True) payment_against_delivery_enabled = models.BooleanField(default=True) # END :: SoftButterfly Extensions ------------------------------------------ translated = TranslationProxy() class Meta: permissions = ( ( 'manage_settings', pgettext_lazy( 'Permission description', 'Manage settings.' ) ), ( 'manage_translations', pgettext_lazy( 'Permission description', 'Manage translations.' ) ), ) def __str__(self): return self.site.name def available_backends(self): return self.authorizationkey_set.values_list('name', flat=True) # BEGIN :: SoftButterfly Extensions ---------------------------------------- # Payment settings --------------------------------------------------------- def payment(self): payments = { 'cashPayment': { 'enabled': self.cash_payment_enabled and self.bank_accounts.exists(), 'bankAccounts': None }, 'deliveryPayment': { 'enabled': self.payment_against_delivery_enabled, }, } if payments['cashPayment']['enabled']: payments['cashPayment']['bankAccounts'] = [ { 'number': bank_account.number, 'provider': bank_account.provider_short_name, } for bank_account in self.bank_accounts.all() ] return json.dumps(payments) # Storefront settings ------------------------------------------------------ def dashboard_css(self): return mark_safe(f''' <style> .top-nav {{ background: {self.dashboard_header_color}; }} .top-nav.subheader {{ background: {self.dashboard_subheader_color}; }} .btn-fab-default, .btn-fab-presentation {{ background: {self.dashboard_button_color}; }} .btn-fab-default:hover, .btn-fab-presentation:hover {{ background: {self.dashboard_button_color}; }} header .top-nav #toggle-menu svg path {{ fill: {self.dashboard_header_text_color}; }} .hide-on-small-only svg {{ fill: {self.dashboard_header_text_color}; }} header .top-nav .dropdown-button svg {{ fill: {self.dashboard_header_text_color}; }} .nav-wrapper .input-field input[type=search]::placeholder {{ color: {self.dashboard_header_text_color}; }} .breadcrumbs li {{ color: {self.dashboard_header_text_color}; }} .breadcrumbs li a {{ color: {self.dashboard_header_text_color}; }} .breadcrumbs li a:hover {{ color: {self.dashboard_header_text_color}; }} .breadcrumb:last-child {{ color: {self.dashboard_header_text_color}; }} .breadcrumbs li.back-mobile svg {{ fill: {self.dashboard_header_text_color}; }} #search:focus {{ border-bottom: 1px solid {self.dashboard_button_color}; box-shadow: 0 1px 0 0 {self.dashboard_button_color}; }} .pagination li.active {{ background-color: {self.dashboard_button_color}; }} @media (max-width: 600px) {{ .search {{ background: {self.dashboard_button_color}; }} }} </style> ''') @property def facebook_key(self): facebook = self.authorizationkey_set.filter(name=AuthenticationBackends.FACEBOOK) if facebook.exists(): return facebook.first().key return None @property def google_key(self): google = self.authorizationkey_set.filter(name=AuthenticationBackends.GOOGLE) if google.exists(): return google.first().key return None
class Tag(models.Model): label = CharField(max_length=50, null=False, unique=True) color = ColorField(default="#FF0000")
class Petition(models.Model): NO = "no gradient" RIGHT = "to right" BOTTOM = "to bottom" BOTTOM_RIGHT = "to bottom right" BOTTOM_LEFT = "to bottom left" LINEAR_GRADIENT_CHOICES = ((NO, "no gradient"), (RIGHT, "to right"), (BOTTOM, "to bottom"), (BOTTOM_RIGHT, "to bottom right"), (BOTTOM_LEFT, "to bottom left")) MAIL = "MAIL" POST = "POST" GET = "GET" NEWSLETTER_SUBSCRIBE_METHOD_CHOICES = ((MAIL, "MAIL"), (POST, "POST"), (GET, "GET")) title = models.TextField(verbose_name=ugettext_lazy("Title")) text = tinymce_models.HTMLField(blank=True) side_text = tinymce_models.HTMLField(blank=True) target = models.IntegerField(default=500) linear_gradient_direction = models.CharField( choices=LINEAR_GRADIENT_CHOICES, max_length=15, default=NO, blank=True) gradient_from = ColorField(blank=True) gradient_to = ColorField(blank=True) bgcolor = ColorField(blank=True) footer_text = tinymce_models.HTMLField(blank=True) footer_links = tinymce_models.HTMLField(blank=True) twitter_description = models.CharField(max_length=200, blank=True) twitter_image = models.CharField(max_length=500, blank=True) has_newsletter = models.BooleanField(default=False) newsletter_subscribe_http_data = models.TextField(blank=True) newsletter_subscribe_http_mailfield = models.CharField(max_length=100, blank=True) newsletter_subscribe_http_url = models.CharField(max_length=1000, blank=True) newsletter_subscribe_mail_subject = models.CharField(max_length=1000, blank=True) newsletter_subscribe_mail_from = models.CharField(max_length=500, blank=True) newsletter_subscribe_mail_to = models.CharField(max_length=500, blank=True) newsletter_subscribe_method = models.CharField( choices=NEWSLETTER_SUBSCRIBE_METHOD_CHOICES, max_length=4, default=MAIL) newsletter_subscribe_mail_smtp_host = models.CharField(max_length=100, default='localhost', blank=True) newsletter_subscribe_mail_smtp_port = models.IntegerField(default=25, blank=True) newsletter_subscribe_mail_smtp_user = models.CharField(max_length=200, blank=True) newsletter_subscribe_mail_smtp_password = models.CharField(max_length=200, blank=True) newsletter_subscribe_mail_smtp_tls = models.BooleanField(default=False) newsletter_subscribe_mail_smtp_starttls = models.BooleanField( default=False) org_twitter_handle = models.CharField(max_length=20, blank=True) published = models.BooleanField(default=False) newsletter_text = models.CharField(max_length=1000, blank=True) sign_form_footer = models.TextField(blank=True) confirmation_email_sender = models.CharField(max_length=100, blank=True) confirmation_email_smtp_host = models.CharField(max_length=100, default='localhost', blank=True) confirmation_email_smtp_port = models.IntegerField(default=25, blank=True) confirmation_email_smtp_user = models.CharField(max_length=200, blank=True) confirmation_email_smtp_password = models.CharField(max_length=200, blank=True) confirmation_email_smtp_tls = models.BooleanField(default=False) confirmation_email_smtp_starttls = models.BooleanField(default=False) use_custom_email_settings = models.BooleanField(default=False) salt = models.TextField(blank=True) slugs = models.ManyToManyField('SlugModel', blank=True, through='SlugOwnership') def prepopulate_from_template(self, template): for field in self._meta.fields: if hasattr(self, field.name) and hasattr(template, field.name): template_value = getattr(template, field.name) if template_value is not None and template_value != "": setattr(self, field.name, template_value) def save(self, *args, **kwargs): super().save(*args, **kwargs) if not self.salt: hasher = get_hasher() self.salt = hasher.salt().decode('utf-8') super().save() def slugify(self): if self.slugs.count() == 0: slugtext = slugify(self.raw_title) # let's search for slug collisions filters = {'slugs__slug': slugtext} if self.organization_set.count() > 0: org = self.organization_set.first() filters.update({'organization__name': org.name}) else: user = self.pytitionuser_set.first() filters.update( {'pytitionuser__user__username': user.user.username}) results = Petition.objects.filter(**filters) if results.count() > 0: raise ValueError( _("This slug is already used by another petition from this organization/user" )) slug = SlugModel(slug=slugify(slugtext)) slug.save() self.slugs.add(slug) self.save() @classmethod def by_id(cls, id): try: return Petition.objects.get(pk=id) except Petition.DoesNotExist: return None def get_signature_number(self, confirmed=None): signatures = self.signature_set if confirmed is not None: signatures = signatures.filter(confirmed=confirmed) return signatures.count() def already_signed(self, email): signature_number = Signature.objects.filter(petition = self.id)\ .filter(confirmed = True).filter(email = email).count() return signature_number > 0 def confirm_signature(self, conf_hash): signature = Signature.objects.filter(petition=self.id).get( confirmation_hash=conf_hash) if signature: # Now confirm the signature corresponding to this hash signature.confirm() signature.save() return _("Thank you for confirming your signature!") else: return None def add_slug(self, slugtext): with transaction.atomic(): slugtext = slugify(slugtext) slug = SlugModel.objects.create(slug=slugtext) if self.owner_type == "org": SlugOwnership.objects.create(slug=slug, petition=self, organization=self.owner) elif self.owner_type == "user": SlugOwnership.objects.create(slug=slug, petition=self, user=self.owner) else: raise ValueError( _("This petition has no owner, cannot add slug!")) def del_slug(self, slug): slug.delete() def publish(self): self.published = True self.save() def unpublish(self): self.published = False self.save() @property def owner_type(self): if self.organization_set.count() > 0: return "org" elif self.pytitionuser_set.count() > 0: return "user" else: return "no_owner" @property def owner(self): if self.organization_set.count() > 0: return self.organization_set.first() elif self.pytitionuser_set.count() > 0: return self.pytitionuser_set.first() else: return None @property def signature_number(self): return self.get_signature_number(True) @property def raw_twitter_description(self): return html.unescape(mark_safe(strip_tags(self.twitter_description))) @property def raw_text(self): return html.unescape(mark_safe(strip_tags(self.text))) @property def raw_title(self): return html.unescape(mark_safe(strip_tags(self.title).strip())) def __str__(self): return self.raw_title def __repr__(self): return self.raw_title @property def url(self): slugs = self.slugs.all() if len(slugs) == 0: # If there is no slug, ugly url return reverse('detail', kwargs={'petition_id': self.id}) else: if self.organization_set.count() > 0: # This petition is owned by an Organization org = self.organization_set.first() return reverse("slug_show_petition", kwargs={ "orgslugname": org.slugname, "petitionname": slugs[0] }) elif self.pytitionuser_set.count() > 0: # This petition is owned by a PytitionUser user = self.pytitionuser_set.first() return reverse("slug_show_petition", kwargs={ "username": user.user.username, "petitionname": slugs[0] }) else: # This is a BUG! raise ValueError( _("This petition is buggy. Sorry about that!"))
class Color(models.Model): color_name = models.CharField(blank=True, max_length=50) color = ColorField(default='#FF0000') def __str__(self): return self.color_name
class Theme(models.Model): @staticmethod def post_migrate_handler(**kwargs): del_cached_active_theme() Theme.get_active_theme() @staticmethod def post_delete_handler(**kwargs): del_cached_active_theme() Theme.get_active_theme() @staticmethod def post_save_handler(instance, **kwargs): del_cached_active_theme() if instance.active: Theme.objects.exclude(pk=instance.pk).update(active=False) Theme.get_active_theme() @staticmethod def pre_save_handler(instance, **kwargs): if instance.pk is None: try: obj = Theme.objects.get(name=instance.name) if obj: instance.pk = obj.pk except Theme.DoesNotExist: pass @staticmethod def get_active_theme(): objs_manager = Theme.objects objs_active_qs = objs_manager.filter(active=True) objs_active_ls = list(objs_active_qs) objs_active_count = len(objs_active_ls) if objs_active_count == 0: obj = objs_manager.all().first() if obj: obj.set_active() else: obj = objs_manager.create() elif objs_active_count == 1: obj = objs_active_ls[0] elif objs_active_count > 1: obj = objs_active_ls[-1] obj.set_active() return obj name = models.CharField(unique=True, max_length=50, default='Django', verbose_name=_('name')) active = models.BooleanField(default=True, verbose_name=_('active')) title = models.CharField(max_length=50, default=_('Django administration'), blank=True, verbose_name=_('title')) title_color = ColorField(blank=True, default='#F5DD5D', help_text='#F5DD5D', max_length=10, verbose_name=_('color')) title_visible = models.BooleanField(default=True, verbose_name=_('visible')) logo = models.FileField( upload_to='admin-interface/logo/', blank=True, help_text=_('Leave blank to use the default Django logo'), verbose_name=_('logo')) logo_color = ColorField(blank=True, default='#FFFFFF', help_text='#FFFFFF', max_length=10, verbose_name=_('color')) logo_visible = models.BooleanField(default=True, verbose_name=_('visible')) favicon = models.FileField( upload_to='admin-interface/favicon/', blank=True, help_text=_('(.ico|.png|.gif - 16x16|32x32 px)'), verbose_name=_('favicon')) env_name = models.CharField(blank=True, max_length=50, verbose_name=_('name')) env_color = ColorField( blank=True, default='#E74C3C', help_text= _('(red: #E74C3C, orange: #E67E22, yellow: #F1C40F, green: #2ECC71, blue: #3498DB)' ), max_length=10, verbose_name=_('color')) env_visible_in_header = models.BooleanField( default=True, verbose_name=_('visible in header (marker and name)')) env_visible_in_favicon = models.BooleanField( default=True, verbose_name=_('visible in favicon (marker)')) language_chooser_active = models.BooleanField(default=True, verbose_name=_('active')) language_chooser_display_choices = ( ( 'code', _('code'), ), ( 'name', _('name'), ), ) language_chooser_display = models.CharField( max_length=10, choices=language_chooser_display_choices, default='code', verbose_name=_('display')) css_header_background_color = ColorField( blank=True, default='#0C4B33', help_text='#0C4B33', max_length=10, verbose_name=_('background color')) css_header_text_color = ColorField(blank=True, default='#44B78B', help_text='#44B78B', max_length=10, verbose_name=_('text color')) css_header_link_color = ColorField(blank=True, default='#FFFFFF', help_text='#FFFFFF', max_length=10, verbose_name=_('link color')) css_header_link_hover_color = ColorField( blank=True, default='#C9F0DD', help_text='#C9F0DD', max_length=10, verbose_name=_('link hover color')) css_module_background_color = ColorField( blank=True, default='#44B78B', help_text='#44B78B', max_length=10, verbose_name=_('background color')) css_module_text_color = ColorField(blank=True, default='#FFFFFF', help_text='#FFFFFF', max_length=10, verbose_name=_('text color')) css_module_link_color = ColorField(blank=True, default='#FFFFFF', help_text='#FFFFFF', max_length=10, verbose_name=_('link color')) css_module_link_hover_color = ColorField( blank=True, default='#C9F0DD', help_text='#C9F0DD', max_length=10, verbose_name=_('link hover color')) css_module_rounded_corners = models.BooleanField( default=True, verbose_name=_('rounded corners')) css_generic_link_color = ColorField(blank=True, default='#0C3C26', help_text='#0C3C26', max_length=10, verbose_name=_('link color')) css_generic_link_hover_color = ColorField( blank=True, default='#156641', help_text='#156641', max_length=10, verbose_name=_('link hover color')) css_save_button_background_color = ColorField( blank=True, default='#0C4B33', help_text='#0C4B33', max_length=10, verbose_name=_('background color')) css_save_button_background_hover_color = ColorField( blank=True, default='#0C3C26', help_text='#0C3C26', max_length=10, verbose_name=_('background hover color')) css_save_button_text_color = ColorField(blank=True, default='#FFFFFF', help_text='#FFFFFF', max_length=10, verbose_name=_('text color')) css_delete_button_background_color = ColorField( blank=True, default='#BA2121', help_text='#BA2121', max_length=10, verbose_name=_('background color')) css_delete_button_background_hover_color = ColorField( blank=True, default='#A41515', help_text='#A41515', max_length=10, verbose_name=_('background hover color')) css_delete_button_text_color = ColorField(blank=True, default='#FFFFFF', help_text='#FFFFFF', max_length=10, verbose_name=_('text color')) css = models.TextField(blank=True, verbose_name=_('text color')) related_modal_active = models.BooleanField(default=True, verbose_name=_('active')) related_modal_background_color = ColorField( blank=True, default='#000000', help_text='#000000', max_length=10, verbose_name=_('background color')) related_modal_background_opacity_choices = ( ( '0.1', '10%', ), ( '0.2', '20%', ), ( '0.3', '30%', ), ( '0.4', '40%', ), ( '0.5', '50%', ), ( '0.6', '60%', ), ( '0.7', '70%', ), ( '0.8', '80%', ), ( '0.9', '90%', ), ) related_modal_background_opacity = models.CharField( max_length=5, choices=related_modal_background_opacity_choices, default='0.3', help_text='20%', verbose_name=_('background opacity')) related_modal_rounded_corners = models.BooleanField( default=True, verbose_name=_('rounded corners')) related_modal_close_button_visible = models.BooleanField( default=True, verbose_name=_('close button visible')) list_filter_dropdown = models.BooleanField(default=True, verbose_name=_('use dropdown')) list_filter_sticky = models.BooleanField(default=True, verbose_name=_('sticky position')) recent_actions_visible = models.BooleanField(default=True, verbose_name=_('visible')) form_submit_sticky = models.BooleanField(default=False, verbose_name=_('sticky submit')) form_pagination_sticky = models.BooleanField( default=False, verbose_name=_('sticky pagination')) def set_active(self): self.active = True self.save() class Meta: app_label = 'admin_interface' verbose_name = _('Theme') verbose_name_plural = _('Themes') def __str__(self): return force_str(self.name)
class Car(models.Model): # (Value to be stored in model, Human readable form) for dropdown state_choice = ( ('AL', 'Alabama'), ('AK', 'Alaska'), ('AZ', 'Arizona'), ('AR', 'Arkansas'), ('CA', 'California'), ('CO', 'Colorado'), ('CT', 'Connecticut'), ('DE', 'Delaware'), ('DC', 'District Of Columbia'), ('FL', 'Florida'), ('GA', 'Georgia'), ('HI', 'Hawaii'), ('ID', 'Idaho'), ('IL', 'Illinois'), ('IN', 'Indiana'), ('IA', 'Iowa'), ('KS', 'Kansas'), ('KY', 'Kentucky'), ('LA', 'Louisiana'), ('ME', 'Maine'), ('MD', 'Maryland'), ('MA', 'Massachusetts'), ('MI', 'Michigan'), ('MN', 'Minnesota'), ('MS', 'Mississippi'), ('MO', 'Missouri'), ('MT', 'Montana'), ('NE', 'Nebraska'), ('NV', 'Nevada'), ('NH', 'New Hampshire'), ('NJ', 'New Jersey'), ('NM', 'New Mexico'), ('NY', 'New York'), ('NC', 'North Carolina'), ('ND', 'North Dakota'), ('OH', 'Ohio'), ('OK', 'Oklahoma'), ('OR', 'Oregon'), ('PA', 'Pennsylvania'), ('RI', 'Rhode Island'), ('SC', 'South Carolina'), ('SD', 'South Dakota'), ('TN', 'Tennessee'), ('TX', 'Texas'), ('UT', 'Utah'), ('VT', 'Vermont'), ('VA', 'Virginia'), ('WA', 'Washington'), ('WV', 'West Virginia'), ('WI', 'Wisconsin'), ('WY', 'Wyoming'), ) # Year dropdown from 2000 to current year year_choice = [] for r in range(2000, (datetime.now().year + 1)): year_choice.append((r, r)) # (Value to be stored in model, Human readable form) for dropdown features_choices = ( ('Cruise Control', 'Cruise Control'), ('Audio Interface', 'Audio Interface'), ('Airbags', 'Airbags'), ('Air Conditioning', 'Air Conditioning'), ('Seat Heating', 'Seat Heating'), ('Alarm System', 'Alarm System'), ('ParkAssist', 'ParkAssist'), ('Power Steering', 'Power Steering'), ('Reversing Camera', 'Reversing Camera'), ('Direct Fuel Injection', 'Direct Fuel Injection'), ('Auto Start/Stop', 'Auto Start/Stop'), ('Wind Deflector', 'Wind Deflector'), ('Bluetooth Handset', 'Bluetooth Handset'), ) # (Value to be stored in model, Human readable form) for dropdown door_choices = ( ('2', '2'), ('3', '3'), ('4', '4'), ('5', '5'), ('6', '6'), ) car_title = models.CharField(max_length=255) state = models.CharField(choices=state_choice, max_length=100, default='Alabama') city = models.CharField(max_length=100) color = ColorField(default='#FF0000') model = models.CharField(max_length=100) year = models.IntegerField(('year'), choices=year_choice, default=datetime.now().year) condition = models.CharField(max_length=100) price = models.IntegerField() description = RichTextField() car_photo = models.ImageField(upload_to='photos/%Y/%m/%d/') car_photo_1 = models.ImageField(upload_to='photos/%Y/%m/%d/', blank=True) car_photo_2 = models.ImageField(upload_to='photos/%Y/%m/%d/', blank=True) car_photo_3 = models.ImageField(upload_to='photos/%Y/%m/%d/', blank=True) car_photo_4 = models.ImageField(upload_to='photos/%Y/%m/%d/', blank=True) features = MultiSelectField(choices=features_choices) body_style = models.CharField(max_length=100) engine = models.CharField(max_length=100) transmission = models.CharField(max_length=100) interior = models.CharField(max_length=100) miles = models.IntegerField() doors = models.CharField(choices=door_choices, max_length=10, default='2') passengers = models.IntegerField() vin_no = models.CharField(max_length=100) milage = models.IntegerField() fuel_type = models.CharField(max_length=50) no_of_owners = models.CharField(max_length=100) is_featured = models.BooleanField(default=False) created_date = models.DateTimeField(default=datetime.now, blank=True)
class Color(models.Model): color = ColorField(default='#FF0000') def __str__(self): return str(self.color)
class Petition(models.Model): NO = "no gradient" RIGHT = "to right" BOTTOM = "to bottom" BOTTOM_RIGHT = "to bottom right" BOTTOM_LEFT = "to bottom left" LINEAR_GRADIENT_CHOICES = ( (NO, "no gradient"), (RIGHT, "to right"), (BOTTOM, "to bottom"), (BOTTOM_RIGHT, "to bottom right"), (BOTTOM_LEFT, "to bottom left") ) MAIL = "MAIL" POST = "POST" GET = "GET" NEWSLETTER_SUBSCRIBE_METHOD_CHOICES = ( (MAIL, "MAIL"), (POST, "POST"), (GET, "GET") ) title = models.TextField(verbose_name=ugettext_lazy("Title")) text = tinymce_models.HTMLField(blank=True) side_text = tinymce_models.HTMLField(blank=True) target = models.IntegerField(default=500) linear_gradient_direction = models.CharField(choices=LINEAR_GRADIENT_CHOICES, max_length=15, default=NO, blank=True) gradient_from = ColorField(blank=True) gradient_to = ColorField(blank=True) bgcolor = ColorField(blank=True) footer_text = tinymce_models.HTMLField(blank=True) footer_links = tinymce_models.HTMLField(blank=True) twitter_description = models.CharField(max_length=200, blank=True) twitter_image = models.CharField(max_length=500, blank=True) has_newsletter = models.BooleanField(default=False) newsletter_subscribe_http_data = models.TextField(blank=True) newsletter_subscribe_http_mailfield = models.CharField(max_length=100, blank=True) newsletter_subscribe_http_url = models.CharField(max_length=1000, blank=True) newsletter_subscribe_mail_subject = models.CharField(max_length=1000, blank=True) newsletter_subscribe_mail_from = models.CharField(max_length=500, blank=True) newsletter_subscribe_mail_to = models.CharField(max_length=500, blank=True) newsletter_subscribe_method = models.CharField(choices=NEWSLETTER_SUBSCRIBE_METHOD_CHOICES, max_length=4, default=MAIL) newsletter_subscribe_mail_smtp_host = models.CharField(max_length=100, default='localhost', blank=True) newsletter_subscribe_mail_smtp_port = models.IntegerField(default=25, blank=True) newsletter_subscribe_mail_smtp_user = models.CharField(max_length=200, blank=True) newsletter_subscribe_mail_smtp_password = models.CharField(max_length=200, blank=True) newsletter_subscribe_mail_smtp_tls = models.BooleanField(default=False) newsletter_subscribe_mail_smtp_starttls = models.BooleanField(default=False) org_twitter_handle = models.CharField(max_length=20, blank=True) published = models.BooleanField(default=False) newsletter_text = models.CharField(max_length=1000, blank=True) sign_form_footer = models.TextField(blank=True) confirmation_email_sender = models.CharField(max_length=100, blank=True) confirmation_email_smtp_host = models.CharField(max_length=100, default='localhost', blank=True) confirmation_email_smtp_port = models.IntegerField(default=25, blank=True) confirmation_email_smtp_user = models.CharField(max_length=200, blank=True) confirmation_email_smtp_password = models.CharField(max_length=200, blank=True) confirmation_email_smtp_tls = models.BooleanField(default=False) confirmation_email_smtp_starttls = models.BooleanField(default=False) use_custom_email_settings = models.BooleanField(default=False) @classmethod def by_id(cls, id): try: return Petition.objects.get(pk=id) except Petition.DoesNotExist: return None def get_signature_number(self, confirmed=None): signatures = self.signature_set if confirmed is not None: signatures = signatures.filter(confirmed=confirmed) return signatures.count() def already_signed(self, email): signature_number = Signature.objects.filter(petition = self.id)\ .filter(confirmed = True).filter(email = email).count() return signature_number > 0 def confirm_signature(self, conf_hash): signature = Signature.objects.filter(petition=self.id).get(confirmation_hash=conf_hash) if signature: # Now confirm the signature corresponding to this hash signature.confirm() signature.save() return _("Thank you for confirming your signature!") else: return None def publish(self): self.published = True self.save() def unpublish(self): self.published = False self.save() @property def signature_number(self): return self.get_signature_number(True) @property def raw_twitter_description(self): return html.unescape(mark_safe(strip_tags(self.twitter_description))) @property def raw_text(self): return html.unescape(mark_safe(strip_tags(self.text))) @property def raw_title(self): return html.unescape(mark_safe(strip_tags(self.title).strip())) def __str__(self): return self.raw_title def __repr__(self): return self.raw_title
class PetitionTemplate(models.Model): NO = "no gradient" RIGHT = "to right" BOTTOM = "to bottom" BOTTOM_RIGHT = "to bottom right" BOTTOM_LEFT = "to bottom left" LINEAR_GRADIENT_CHOICES = ((NO, "no gradient"), (RIGHT, "to right"), (BOTTOM, "to bottom"), (BOTTOM_RIGHT, "to bottom right"), (BOTTOM_LEFT, "to bottom left")) MAIL = "MAIL" POST = "POST" GET = "GET" NEWSLETTER_SUBSCRIBE_METHOD_CHOICES = ((MAIL, "MAIL"), (POST, "POST"), (GET, "GET")) # Description name = models.CharField(max_length=50, verbose_name=ugettext_lazy("Name")) text = tinymce_models.HTMLField(blank=True) side_text = tinymce_models.HTMLField(blank=True) target = models.IntegerField(blank=True, null=True) # Owner user = models.ForeignKey(PytitionUser, on_delete=models.CASCADE, null=True, blank=True) org = models.ForeignKey(Organization, on_delete=models.CASCADE, null=True, blank=True) # Fancy colors linear_gradient_direction = models.CharField( choices=LINEAR_GRADIENT_CHOICES, max_length=15, default=NO, blank=True) gradient_from = ColorField(blank=True) gradient_to = ColorField(blank=True) bgcolor = ColorField(blank=True) footer_text = tinymce_models.HTMLField(blank=True) footer_links = tinymce_models.HTMLField(blank=True) twitter_description = models.CharField(max_length=200, blank=True) twitter_image = models.CharField(max_length=500, blank=True) has_newsletter = models.BooleanField(default=False) newsletter_subscribe_http_data = models.TextField(blank=True) newsletter_subscribe_http_mailfield = models.CharField(max_length=100, blank=True) newsletter_subscribe_http_url = models.CharField(max_length=1000, blank=True) newsletter_subscribe_mail_subject = models.CharField(max_length=1000, blank=True) newsletter_subscribe_mail_from = models.EmailField(max_length=500, blank=True) newsletter_subscribe_mail_to = models.EmailField(max_length=500, blank=True) newsletter_subscribe_method = models.CharField( choices=NEWSLETTER_SUBSCRIBE_METHOD_CHOICES, max_length=4, default=MAIL) newsletter_subscribe_mail_smtp_host = models.CharField(max_length=100, default='localhost', blank=True) newsletter_subscribe_mail_smtp_port = models.IntegerField(default=25) newsletter_subscribe_mail_smtp_user = models.CharField(max_length=200, blank=True) newsletter_subscribe_mail_smtp_password = models.CharField(max_length=200, blank=True) newsletter_subscribe_mail_smtp_tls = models.BooleanField(default=False) newsletter_subscribe_mail_smtp_starttls = models.BooleanField( default=False) org_twitter_handle = models.CharField(max_length=20, blank=True) newsletter_text = models.CharField(max_length=1000, blank=True) sign_form_footer = models.TextField(blank=True) confirmation_email_reply = models.EmailField(max_length=100, blank=True) use_custom_email_settings = models.BooleanField(default=False) def __str__(self): return self.name def __repr__(self): return self.name @property def owner_type(self): if self.org: return "org" else: return "user" def save(self, *args, **kwargs): if (self.org is None and self.user is None): raise Exception("You need to provide a user or org as owner") elif (self.org is not None and self.user is not None): raise Exception("A petition can have only one owner") else: super(PetitionTemplate, self).save(*args, **kwargs)
class Titles(models.Model): title_name = models.CharField(_('Title Name'), max_length=250, unique=True, null=True, blank=True) desc = models.TextField(_('Description of the Title'), blank=True, null=True) gender = models.CharField(max_length=6, choices=( ('ALL', 'ALL'), ('m', 'Male'), ('f', 'Female'), ), default='m', verbose_name=_('Gender')) title_stu = models.CharField(max_length=10, choices=( ('ALL', 'ALL'), ('SC-1', 'SC-1'), ('SC-2', 'SC-2'), ('SC-3', 'SC-3'), ('COMMERCE', 'COMMERCE'), ('ARTS', 'ARTS'), ), default='sc1', verbose_name=_('Class')) colour = ColorField(default='#f57e42') slug = models.CharField(max_length=250, verbose_name=_('Slug of the Title'), unique=True, blank=True, null=True) total_vote = models.PositiveBigIntegerField( _('Total No of Vote Registered'), default=0) def __str__(self): return self.title_name def save(self, *args, **kwargs): import string self.nameb = '' for i in self.title_name.split(' '): self.nameb += str(i.capitalize()) + ' ' self.title_name = self.nameb slug1 = ''.join(self.title_name.lower().translate( {ord(c): None for c in string.whitespace})) unwanted_char = [ '.', "'", '"', '>', '<', '?', "\\", '/', '*', '.', ',', '!', '@', '#', '$', '%', '^', '&', '(', ')', '-', '_', '+', '=', '{', '}', '[', ']', '|', ':', ';', ' ' ] self.slug = ''.join((filter(lambda i: i not in unwanted_char, slug1))) return super(Titles, self).save(*args, **kwargs) class Meta: verbose_name_plural = "Titles" ordering = ('colour', '-total_vote', 'title_name')