Exemple #1
0
class SeverityChoice(models.Model):
    name = models.CharField(max_length=50)
    color = ColorField(default='#777')

    def __unicode__(self):
        return self.name
Exemple #2
0
class TypeTransaction(MetaDataTable):
    theme_color = ColorField(default='#FF0000')
Exemple #3
0
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)
Exemple #4
0
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
Exemple #5
0
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",
        ]
Exemple #6
0
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'Опубликовано?')
Exemple #7
0
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'
Exemple #8
0
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)
Exemple #9
0
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
Exemple #10
0
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')
Exemple #11
0
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)
Exemple #12
0
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')
Exemple #13
0
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
Exemple #14
0
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)
Exemple #15
0
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 ''
Exemple #16
0
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)
Exemple #17
0
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]}
Exemple #18
0
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))
Exemple #19
0
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, ))
Exemple #20
0
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
Exemple #21
0
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
Exemple #22
0
class Tag(models.Model):
    label = CharField(max_length=50, null=False, unique=True)
    color = ColorField(default="#FF0000")
Exemple #23
0
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!"))
Exemple #24
0
class Color(models.Model):
    color_name = models.CharField(blank=True, max_length=50)
    color = ColorField(default='#FF0000')

    def __str__(self):
        return self.color_name
Exemple #25
0
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)
Exemple #26
0
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)
Exemple #27
0
class Color(models.Model):
    color = ColorField(default='#FF0000')

    def __str__(self):
        return str(self.color)
Exemple #28
0
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
Exemple #29
0
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)
Exemple #30
0
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')