示例#1
0
class Marquee_Style(models.Model):
    image = models.ForeignKey('Image',
                              on_delete=models.CASCADE,
                              blank=True,
                              null=True)
    words = models.ForeignKey('Words',
                              on_delete=models.CASCADE,
                              blank=True,
                              null=True)
    behavior = models.CharField(max_length=24, default="scroll")
    direction = models.CharField(max_length=18, default="left")
    scrollamount = models.IntegerField(default=1)
    scrollamount_range = IntegerRangeField(
        default='(1, 50)',
        blank=True,
        null=True,
        validators=[RangeMinValueValidator(1),
                    RangeMaxValueValidator(5)])
    scrolldelay = models.IntegerField(default=1)
    scrolldelay_range = IntegerRangeField(
        default='(1, 50)',
        blank=True,
        null=True,
        validators=[RangeMinValueValidator(1),
                    RangeMaxValueValidator(5)])
示例#2
0
class Words_Style(models.Model):
    words = models.ForeignKey('Words', on_delete=models.CASCADE)
    #default color as rgba xxx,xxx,xxx append alpha from opacity when return
    color = models.CharField(default='0,0,0', blank=True, max_length=13)
    #if choosing to have a color increase then do so by x amount (int)
    color_r_int = models.IntegerField(default=0, blank=True)
    #red color is 0-255 max
    color_range_r = IntegerRangeField(
        default='(0, 255)',
        blank=True,
        validators=[RangeMinValueValidator(0),
                    RangeMaxValueValidator(255)])
    color_g_int = models.IntegerField(default=0, blank=True)
    color_range_g = IntegerRangeField(
        default='(0, 255)',
        blank=True,
        validators=[RangeMinValueValidator(0),
                    RangeMaxValueValidator(255)])
    color_b_int = models.IntegerField(default=0, blank=True)
    color_range_b = IntegerRangeField(
        default='(0, 255)',
        blank=True,
        validators=[RangeMinValueValidator(0),
                    RangeMaxValueValidator(255)])

    size = models.IntegerField(default=1, blank=True)
    size_range = IntegerRangeField(
        default='(1, 10)',
        blank=True,
        validators=[RangeMinValueValidator(1),
                    RangeMaxValueValidator(10)])
    style = models.CharField(max_length=8, default='', blank=True)
    marquee = models.BooleanField(default=False)
示例#3
0
class PackageType(models.Model):

    name = models.CharField(verbose_name=_('name'),
                            max_length=100,
                            unique=True)
    description = models.TextField(verbose_name=_('description'),
                                   max_length=200)
    codename = models.CharField(verbose_name=_('codename'),
                                max_length=100,
                                unique=True)
    weight = IntegerRangeField(verbose_name=_('weight'))
    height = IntegerRangeField(verbose_name=_('height'))
    width = IntegerRangeField(verbose_name=_('width'))
    price = models.DecimalField(verbose_name=_('price'),
                                max_digits=6,
                                decimal_places=2)
    created_at = models.DateTimeField(verbose_name=_('created at'),
                                      auto_now_add=True,
                                      editable=False)
    updated_at = models.DateTimeField(verbose_name=_('updated at'),
                                      auto_now=True,
                                      editable=False)

    class Meta:
        verbose_name = _('package type')
        verbose_name_plural = _('package types')

    def __str__(self):
        return self.name
示例#4
0
class LikertAnswer(TimeStampedModel):
    """
    Likert answer (scale) model.
    Minimum and maximum values are used to generate the scale layout.
    """

    question = models.OneToOneField(
        Likert, on_delete=models.CASCADE, verbose_name=_("question")
    )
    scale_range = IntegerRangeField(
        _("scale range values"),
        blank=False,
        default=([1, 5]),
        help_text=_("Set the likert scale values."),
    )
    check_answer = models.BooleanField(
        _("check answer"),
        blank=False,
        default=False,
        help_text=_("Check the answer value?"),
    )
    answer_range = IntegerRangeField(
        _("answer range values"),
        blank=True,
        default=([2, 3]),
        help_text=_("Set the minimum and maximum acceptable values."),
    )
    legend = models.TextField(
        _("legend"), blank=True, help_text=_("Legend for the likert scale values.")
    )
    # answer_range = IntegerRangeField()

    def __str__(self):
        return ("%s : scale %s to %s") % (
            self.question.content,
            self.scale_range.lower,
            self.scale_range.upper,
        )

    def clean(self):
        # Don't allow answer scale to be out of the scale range bounds
        if self.answer_range.lower:
            if self.answer_range.lower < self.scale_range.lower:
                raise ValidationError(
                    _("The answer range must not exceed the scale range.")
                )
        elif self.answer_range.upper:
            if self.answer_range.upper > self.scale_range.upper:
                raise ValidationError(
                    _("The answer range must not exceed the scale range.")
                )
        return super().clean()

    class Meta:
        verbose_name = _("likert answer (scale definition)")
        verbose_name_plural = _("likert answers (scale definition)")
示例#5
0
class Flat(models.Model):
    underground = models.ManyToManyField(Underground,
                                         blank=True,
                                         default=None,
                                         verbose_name='Метро')
    type_object = models.ForeignKey(TypeObject,
                                    on_delete=models.PROTECT,
                                    blank=True,
                                    null=True,
                                    verbose_name='Вид объекта')
    total_area = IntegerRangeField('Общая площадь, м2', null=True, blank=True)
    houseroom = IntegerRangeField('Жилая площадь, м2', null=True, blank=True)
    area_kitchen = IntegerRangeField('Площадь кухни, м2',
                                     null=True,
                                     blank=True)
    material_building = models.CharField('Материал здания',
                                         max_length=255,
                                         blank=True,
                                         null=True,
                                         default=None)
    floor = IntegerRangeField('Этаж (число, от - до)', null=True, blank=True)
    not_first_floor = models.BooleanField('Не первый этаж', default=False)
    not_last_floor = models.BooleanField('Не последний этаж (чекбокс)',
                                         default=False)
    count_floor = IntegerRangeField('Этажность (число, от - до)',
                                    null=True,
                                    blank=True)
    count_room = models.PositiveSmallIntegerField('Количество комнат',
                                                  blank=True,
                                                  choices=COUNT_ROOM,
                                                  default=0)
    planing = models.PositiveSmallIntegerField('Планировка',
                                               blank=True,
                                               choices=PLANING,
                                               default=0)
    closet = models.ManyToManyField(Closet,
                                    blank=True,
                                    default=None,
                                    verbose_name='Санузел')
    balcony = models.BooleanField('Балкон', default=False)
    loggia = models.BooleanField('Лоджия', default=False)
    with_photo = models.BooleanField('С фотографией', default=False)
    hypothec = models.BooleanField('Ипотека', default=False)
    bargain = models.BooleanField('Торг', default=False)
    exchange = models.BooleanField('Обмен', default=False)
    net_sale = models.BooleanField('Чистая продажа', default=False)

    def get_mardown(self):
        return 'get_mardown'
示例#6
0
class AgeHouseComposition(BaseModel):
    age = IntegerRangeField(null=True)
    householdtype = models.CharField(max_length=255)
    sheltertype = models.CharField(max_length=255)

    class Meta:
        db_table = 'agehousecomposition'
示例#7
0
class PostgresModel(Model):
    int_array = ArrayField(IntegerField(null=True, blank=True),
                           size=3,
                           null=True,
                           blank=True)

    hstore = HStoreField(null=True, blank=True)
    try:
        from django.contrib.postgres.fields import JSONField
        json = JSONField(null=True, blank=True)
    except ImportError:
        pass

    int_range = IntegerRangeField(null=True, blank=True)
    try:
        from django.contrib.postgres.fields import FloatRangeField
        float_range = FloatRangeField(null=True, blank=True)
    except ImportError:
        pass

    try:
        from django.contrib.postgres.fields import DecimalRangeField
        decimal_range = DecimalRangeField(null=True, blank=True)
    except ImportError:
        pass
    date_range = DateRangeField(null=True, blank=True)
    datetime_range = DateTimeRangeField(null=True, blank=True)

    class Meta:
        # Tests schema name in table name.
        db_table = '"public"."cachalot_postgresmodel"'
示例#8
0
class HighSchoolClass(models.Model):
    type = models.CharField(choices=HighSchoolClassType.choices, max_length=3)
    name = models.CharField(max_length=200)
    school = models.ForeignKey(School, on_delete=models.CASCADE)
    year = IntegerRangeField()

    def __str__(self):
        return f"{self.type.label}, {self.name}"
示例#9
0
class PostgreFieldsModel(models.Model):
    date_range_field = DateRangeField()
    datetime_range_field = DateTimeRangeField()
    integer_range_field = IntegerRangeField()
    decimal_range_field = DecimalRangeField()

    class Meta:
        app_label = 'tests'
示例#10
0
class FieldHistory(models.Model):
    """Model for a column/field history table"""
    entity = None  # type: models.ForeignKey
    effective = DateTimeRangeField()
    vclock = IntegerRangeField()

    class Meta:
        abstract = True
示例#11
0
class Ad(BaseModel):
    """
    Ads model.
    """
    class Type:
        dating = 'DATING'
        meeting = 'MEETING'
        travel = 'TRAVEL'
        choices = (
            (dating, _('Dating')),
            (meeting, _('Meeting')),
            (travel, _('Travel')),
        )

    user = models.ForeignKey(get_user_model(),
                             related_name='ads',
                             on_delete=models.CASCADE,
                             help_text=_('Ad creator.'))
    type = models.CharField(max_length=16,
                            choices=Type.choices,
                            help_text=_('Ad type.'))
    address = models.CharField(max_length=256, help_text=_('Ad address.'))
    point = models.PointField(
        help_text=_('Geolocation point (in GeoJSON format).'))
    sex = models.CharField(max_length=1,
                           choices=get_user_model().Sex.choices,
                           default=get_user_model().Sex.none,
                           help_text=_('Valid values: M, F, N'))
    ages = IntegerRangeField(help_text=_('Ad age range'))
    title = models.CharField(max_length=128, help_text=_('Title'))
    text = models.TextField(help_text=_('Ad description'))
    period = DateTimeRangeField(default=default_period,
                                help_text=_('Ad period'))
    favorited_for = ArrayField(
        models.CharField(max_length=36),
        help_text=_("Favorite for this users (list of UUIDs)."),
        default=list)
    viewed_by = ArrayField(models.CharField(max_length=36),
                           help_text=_("View by this users (list of UUIDs)."),
                           default=list)
    is_active = models.BooleanField(default=False,
                                    help_text=_('As is publicly published.'))
    is_blocked = models.BooleanField(default=False,
                                     help_text=_('Is blocked by moderator'))

    objects = AdManager()

    class Meta:
        db_table = 'ads'
        ordering = ('-created_at', )

    @cached_property
    def owner(self):
        return self.user

    @property
    def short_text(self):
        return truncatewords(self.text, 6)
示例#12
0
class HighSchoolClass(models.Model):
    # O - ogólnokształcące, MS - mistrzostwa sportowego
    type = models.CharField(max_length=10)
    name = models.CharField(max_length=200)
    school = models.ForeignKey(School, on_delete=models.CASCADE)
    year = IntegerRangeField()

    def __str__(self):
        return ','.join([self.type, self.name])
示例#13
0
class HealthPremium(BaseModel):
    product_variant = models.ForeignKey('product.ProductVariant',
                                        null=True,
                                        blank=True,
                                        on_delete=models.CASCADE)
    deductible = models.ForeignKey('product.DeductibleMaster',
                                   null=True,
                                   blank=True,
                                   on_delete=models.CASCADE)
    sum_insured = models.IntegerField(default=0.0)
    suminsured_range = IntegerRangeField(db_index=True)
    age_range = IntegerRangeField(db_index=True)
    adults = models.IntegerField(null=True, blank=True, db_index=True)
    childrens = models.IntegerField(null=True, blank=True, db_index=True)
    citytier = models.CharField(max_length=256, null=True, blank=True)
    base_premium = models.FloatField(default=Constants.DEFAULT_BASE_PREMIUM)
    gst = models.FloatField(default=Constants.DEFAULT_GST)
    commission = models.FloatField(default=0.0)
    premium = GenericRelation('sales.quote',
                              related_query_name='healthinsurance',
                              object_id_field='premium_id')
    online_process = models.BooleanField(default=True)
    is_active = models.BooleanField(default=True)
    ignore = models.BooleanField(default=False)

    def get_details(self):
        return dict(sum_insured=self.sum_insured,
                    amount=self.amount,
                    commision=self.commission_amount)

    @cached_property
    def commission_amount(self):
        company = self.product_variant.company_category.company
        category = self.product_variant.company_category.category
        return self.amount * (self.commission + company.commission +
                              category.commission)

    @cached_property
    def amount(self):
        return round((self.gst * self.base_premium) + self.base_premium, 2)

    def __str__(self):
        return '%s | %s | %s' % (self.sum_insured, self.product_variant.name,
                                 self.age_range)
示例#14
0
class HelloWorldEntity(BaseModel):
    name = models.CharField(max_length=10, unique=True)
    array_field = ArrayField(models.CharField(max_length=10),
                             size=8,
                             null=True)
    json_field = JSONField(null=True)
    integer_range_field = IntegerRangeField(null=True)

    def __str__(self):
        return self.name
class AgeLevel(RowStatusModel):

    ID = models.AutoField(primary_key=True,db_column='age_level_id')
    value = IntegerRangeField(db_column='value', unique=True)

    def __str__(self):
        return '%s' % self.value

    class Meta:
        db_table = 'age_level'
示例#16
0
class Agehousecomposition(models.Model):
    id = models.AutoField(primary_key=True)
    age = IntegerRangeField(null=True)
    householdtype = models.CharField(max_length=255)
    sheltertype = models.CharField(max_length=255)
    count = models.IntegerField(blank=True, null=True)
    year = models.IntegerField(blank=True, null=True)
    page = models.IntegerField(blank=True, null=True)

    class Meta:
        db_table = 'agehousecomposition'
示例#17
0
class Acsage(models.Model):
    acsid = models.CharField(max_length=1000, blank=True, null=True)
    geoid = models.CharField(max_length=255, blank=True, null=True)
    #    sex = models.CharField(max_length=25, blank=True, null=True)
    age = IntegerRangeField(null=True)
    count = models.IntegerField()
    year = models.IntegerField()
    sourcefile = models.CharField(max_length=255, blank=True, null=True)

    class Meta:
        db_table = 'acsage'
示例#18
0
    class PostgresModel(Model):
        int_array = ArrayField(IntegerField(null=True, blank=True),
                               size=3,
                               null=True,
                               blank=True)

        hstore = HStoreField(null=True, blank=True)

        int_range = IntegerRangeField(null=True, blank=True)
        float_range = FloatRangeField(null=True, blank=True)
        date_range = DateRangeField(null=True, blank=True)
        datetime_range = DateTimeRangeField(null=True, blank=True)
class NumericRangeFilterModel(PostgreSQLModel):
    postgres_int_range = IntegerRangeField(blank=True, null=True)
    postgres_decimal_range = DecimalRangeField(blank=True, null=True)

    @property
    def prop_postgres_int_range(self):
        return self.postgres_int_range

    @property
    def prop_postgres_decimal_range(self):
        return self.postgres_decimal_range

    def __str__(self):
        return F'{self.postgres_int_range} - {self.prop_postgres_decimal_range} ({self.id})'
示例#20
0
class SurveyProfile(models.Model):
    survey_id = models.OneToOneField(Survey)
    age = IntegerRangeField(default=(0, 150))
    GENDER = (('M', 'Male'), ('F', 'Female'), ('A', 'All'))
    gender = models.CharField(max_length=1, choices=GENDER, default='A')
    city = models.CharField(max_length=20, default='A')
    state = models.ManyToManyField('cities_light.Region', blank=True)
    update_time = models.DateTimeField(auto_now=True)

    def __unicode__(self):
        return self.survey_id.name

    def get_state(self):
        return "\n".join([p.name_ascii for p in self.state.all()])
示例#21
0
class CallesGeocod(models.Model):
    id = models.IntegerField(primary_key=True)
    codigo = models.IntegerField(blank=True, null=True)
    nombre = models.CharField(max_length=50, blank=True, null=True)
    alt_i = models.IntegerField(blank=True, null=True)
    alt_f = models.IntegerField(blank=True, null=True)
    tipo = models.CharField(max_length=50, blank=True, null=True)
    geom = models.MultiLineStringField(blank=True, null=True, srid=4326)
    geom_3857 = models.MultiLineStringField(blank=True, null=True, srid=3857)
    rango = IntegerRangeField(blank=True, null=True)

    class Meta:
        managed = True
        db_table = 'calles_geocod'
示例#22
0
class Company(models.Model):
    owner = models.ForeignKey(User, on_delete=models.DO_NOTHING)
    default_profile_image = 'profile.jpg'
    logo = models.ImageField(default=default_profile_image,
                             upload_to='static/images',
                             null=True,
                             blank=True)
    name = models.CharField(max_length=255)
    address = models.CharField(max_length=255)
    ages = IntegerRangeField()
    start = models.DateTimeField()

    def __str__(self):
        return self.name
示例#23
0
class PostgresModel(Model):
    int_array = ArrayField(IntegerField(null=True, blank=True), size=3,
                           null=True, blank=True)

    hstore = HStoreField(null=True, blank=True)

    json = JSONField(null=True, blank=True)

    int_range = IntegerRangeField(null=True, blank=True)
    float_range = FloatRangeField(null=True, blank=True)
    date_range = DateRangeField(null=True, blank=True)
    datetime_range = DateTimeRangeField(null=True, blank=True)

    class Meta:
        # Tests schema name in table name.
        db_table = '"public"."cachalot_postgresmodel"'
示例#24
0
class Activity(Material):
    objects = MaterialQuerySet.as_manager()

    class Meta:
        ordering = ['-timestamp']
        verbose_name = _("Activity")
        verbose_name_plural = _("Activities")

    location = models.ForeignKey(Location,
                                 null=True,
                                 blank=True,
                                 on_delete=models.SET_NULL,
                                 verbose_name=_("location"))

    duration = models.PositiveSmallIntegerField(
        null=True,
        blank=True,
        verbose_name=_("duration"),
        help_text=_("Duration in minutes."),
    )

    num_people = IntegerRangeField(default=NumericRange(2, 30),
                                   verbose_name=_("number of people"))

    group_feature = models.ForeignKey(GroupFeature,
                                      null=True,
                                      blank=True,
                                      on_delete=models.SET_NULL,
                                      verbose_name=_("group feature"))
    notes = LocalizedTextField(null=True, blank=True, verbose_name=_("notes"))
    attachment = models.FileField(upload_to='material/activities/',
                                  blank=True,
                                  verbose_name=_("attachment"))
    url = models.URLField(
        blank=True,
        verbose_name=_("URL"),
        help_text=_(
            "Link the material if its copyright does not allow sharing it."))

    def get_absolute_url(self):
        return reverse('material:detail-activity', kwargs={'slug': self.slug})

    def clean(self):
        if self.num_people.lower < 1:
            raise ValidationError(_("The lower bound must be at least 1."),
                                  code='invalid')
示例#25
0
class Produit(models.Model):
    souscategorie = models.ForeignKey(SousCategrorie,
                                      on_delete=models.CASCADE,
                                      related_name='produit_souscategorie')
    tague = models.ManyToManyField(Tague, related_name='produit_tag')
    titre = models.CharField(max_length=250)
    description = models.TextField()
    image = models.ImageField(upload_to='produit/%Y/%m/%d/')
    taille = ArrayField(models.CharField(max_length=10, blank=True, null=True),
                        default=default_thing)
    family = JSONField()
    prix = IntegerRangeField()
    # periode = DateTimeRangeField(null=True)
    date_add = models.DateTimeField(auto_now_add=True)
    date_upd = models.DateTimeField(auto_now=True)
    status = models.BooleanField(default=False)

    def __str__(self):
        return self.titre
示例#26
0
class AgeGroup(TranslatableModel):
    """Model for age group in database."""

    #  Auto-incrementing 'id' field is automatically set by Django
    slug = models.SlugField()
    ages = IntegerRangeField()
    description = models.CharField(max_length=500, default="")

    def __str__(self):
        """Text representation of AgeGroup object.

        Returns:
            Integer group (str).
        """
        return repr(self.ages)

    class Meta:
        """Set consistent ordering of age groups."""

        ordering = ["ages"]
示例#27
0
class Image_Style(models.Model):
    image = models.ForeignKey('Image', on_delete=models.CASCADE)
    width = models.IntegerField(blank=True, default=0)
    width_range = IntegerRangeField(
        default='(1, 101)',
        blank=True,
        validators=[RangeMinValueValidator(1),
                    RangeMaxValueValidator(100)])
    height = models.IntegerField(blank=True, default=0)
    height_range = IntegerRangeField(
        default='(1,101)',
        blank=True,
        validators=[RangeMinValueValidator(1),
                    RangeMaxValueValidator(100)])
    brads_tl = models.IntegerField(blank=True, default=0)
    brads_tl_range = IntegerRangeField(
        default='(1,101)',
        blank=True,
        validators=[RangeMinValueValidator(1),
                    RangeMaxValueValidator(100)])
    brads_tr = models.IntegerField(blank=True, default=0)
    brads_tr_range = IntegerRangeField(
        default='(1,101)',
        blank=True,
        validators=[RangeMinValueValidator(1),
                    RangeMaxValueValidator(100)])
    brads_bl = models.IntegerField(blank=True, default=0)
    brads_bl_range = IntegerRangeField(
        default='(1,101)',
        blank=True,
        validators=[RangeMinValueValidator(1),
                    RangeMaxValueValidator(100)])
    brads_br = models.IntegerField(blank=True, default=0),
    brads_br_range = IntegerRangeField(
        default='(1,101)',
        blank=True,
        validators=[RangeMinValueValidator(1),
                    RangeMaxValueValidator(100)])
    opacity = models.FloatField(blank=True, default=1)
    opacity_range = FloatRangeField(
        default='(0.1, 1.1)',
        blank=True,
        validators=[RangeMinValueValidator(0.1),
                    RangeMaxValueValidator(1.1)])
    marquee = models.BooleanField(
        default=False
    )  #should look this up...? maybe set up a function to do so.and automatically tie it to the IRS.
class TelephoneNumbersModel(models.Model):
    """
    Модель представляет базу телефонных номеров по операторам связи.
    """
    objects = TelephoneNumbersModelManager()

    abc_or_def = models.PositiveSmallIntegerField(verbose_name='АВС/DEF', )
    numbers_range = IntegerRangeField(
        verbose_name='Диапазон номеров без АВС/DEF.')
    volume = models.PositiveIntegerField(
        verbose_name='Емкость диапазона номеров', )
    operator = models.CharField(
        verbose_name='Наименование оператора связи',
        max_length=150,
    )
    region = models.CharField(
        verbose_name='Местоположение оператора связи',
        max_length=100,
    )

    class Meta:
        verbose_name = 'Диапазон телефонных номеров'
        verbose_name_plural = 'Диапазоны телефонных номеров'
        required_db_vendor = 'postgresql'
        indexes = (GistIndex(
            fields=(
                'abc_or_def',
                'numbers_range',
            ),
            fillfactor=100,
        ), )

    def __str__(self):
        return f'ABC/DEF {self.abc_or_def}, range {self.numbers_range}'

    def __repr__(self):
        return f'{self.pk=} ~ {self.abc_or_def=} ~ {self.numbers_range=}'
示例#29
0
 class Event(models.Model):
     ages = IntegerRangeField(help_text='The age ranges')
     data = JSONField(help_text='Data')
     store = HStoreField()
     tags = ArrayField(models.CharField(max_length=50))
示例#30
0
class Award(TimeStampedModel):
    """
    Award Model.

    The specific award conferred by a Group.
    """

    id = models.UUIDField(
        primary_key=True,
        default=uuid.uuid4,
        editable=False,
    )

    name = models.CharField(
        help_text="""Award Name.""",
        max_length=255,
    )

    STATUS = Choices(
        (
            -10,
            'inactive',
            'Inactive',
        ),
        (
            0,
            'new',
            'New',
        ),
        (
            10,
            'active',
            'Active',
        ),
    )

    status = FSMIntegerField(
        help_text=
        """DO NOT CHANGE MANUALLY unless correcting a mistake.  Use the buttons to change state.""",
        choices=STATUS,
        default=STATUS.new,
    )

    KIND = Choices(
        (32, 'chorus', "Chorus"),
        (41, 'quartet', "Quartet"),
    )

    kind = models.IntegerField(choices=KIND, )

    GENDER = Choices(
        (10, 'male', "Male"),
        (20, 'female', "Female"),
        (30, 'mixed', "Mixed"),
    )

    gender = models.IntegerField(
        help_text="""
            The gender to which the award is restricted.  If unselected, this award is open to all combinations.
        """,
        choices=GENDER,
        null=True,
        blank=True,
    )

    LEVEL = Choices(
        (10, 'championship', "Championship"),
        (30, 'qualifier', "Qualifier"),
        (45, 'representative', "Representative"),
        (50, 'deferred', "Deferred"),
        (60, 'manual', "Manual"),
        (70, 'raw', "Improved - Raw"),
        (80, 'standard', "Improved - Standard"),
    )

    level = models.IntegerField(choices=LEVEL, )

    SEASON = Choices(
        (
            1,
            'summer',
            'Summer',
        ),
        (
            2,
            'midwinter',
            'Midwinter',
        ),
        (
            3,
            'fall',
            'Fall',
        ),
        (
            4,
            'spring',
            'Spring',
        ),
    )

    season = models.IntegerField(choices=SEASON, )

    DISTRICT = Choices(
        (110, 'bhs', 'BHS'),
        (200, 'car', 'CAR'),
        (205, 'csd', 'CSD'),
        (210, 'dix', 'DIX'),
        (215, 'evg', 'EVG'),
        (220, 'fwd', 'FWD'),
        (225, 'ill', 'ILL'),
        (230, 'jad', 'JAD'),
        (235, 'lol', 'LOL'),
        (240, 'mad', 'MAD'),
        (345, 'ned', 'NED'),
        (350, 'nsc', 'NSC'),
        (355, 'ont', 'ONT'),
        (360, 'pio', 'PIO'),
        (365, 'rmd', 'RMD'),
        (370, 'sld', 'SLD'),
        (375, 'sun', 'SUN'),
        (380, 'swd', 'SWD'),
    )

    district = models.IntegerField(
        choices=DISTRICT,
        null=True,
        blank=True,
    )

    DIVISION = Choices(
        (10, 'evgd1', 'EVG Division I'),
        (20, 'evgd2', 'EVG Division II'),
        (30, 'evgd3', 'EVG Division III'),
        (40, 'evgd4', 'EVG Division IV'),
        (50, 'evgd5', 'EVG Division V'),
        (60, 'fwdaz', 'FWD Arizona'),
        (70, 'fwdne', 'FWD Northeast'),
        (80, 'fwdnw', 'FWD Northwest'),
        (90, 'fwdse', 'FWD Southeast'),
        (100, 'fwdsw', 'FWD Southwest'),
        (110, 'lol10l', 'LOL 10000 Lakes'),
        (120, 'lolone', 'LOL Division One'),
        (130, 'lolnp', 'LOL Northern Plains'),
        (140, 'lolpkr', 'LOL Packerland'),
        (150, 'lolsw', 'LOL Southwest'),
        # (160, 'madatl', 'MAD Atlantic'),
        (170, 'madcen', 'MAD Central'),
        (180, 'madnth', 'MAD Northern'),
        (190, 'madsth', 'MAD Southern'),
        # (200, 'madwst', 'MAD Western'),
        (210, 'nedgp', 'NED Granite and Pine'),
        (220, 'nedmtn', 'NED Mountain'),
        (230, 'nedpat', 'NED Patriot'),
        (240, 'nedsun', 'NED Sunrise'),
        (250, 'nedyke', 'NED Yankee'),
        (260, 'swdne', 'SWD Northeast'),
        (270, 'swdnw', 'SWD Northwest'),
        (280, 'swdse', 'SWD Southeast'),
        (290, 'swdsw', 'SWD Southwest'),
    )

    division = models.IntegerField(
        choices=DIVISION,
        null=True,
        blank=True,
    )

    is_single = models.BooleanField(
        help_text="""Single-round award""",
        default=False,
    )

    threshold = models.FloatField(
        help_text="""
            The score threshold for automatic qualification (if any.)
        """,
        null=True,
        blank=True,
    )

    minimum = models.FloatField(
        help_text="""
            The minimum score required for qualification (if any.)
        """,
        null=True,
        blank=True,
    )

    advance = models.FloatField(
        help_text="""
            The score threshold to advance to next round (if any) in
            multi-round qualification.
        """,
        null=True,
        blank=True,
    )

    spots = models.IntegerField(
        help_text="""Number of top spots which qualify""",
        null=True,
        blank=True,
    )

    description = models.TextField(
        help_text="""
            The Public description of the award.""",
        blank=True,
        max_length=1000,
    )

    notes = models.TextField(
        help_text="""
            Private Notes (for internal use only).""",
        blank=True,
    )

    AGE = Choices(
        (
            10,
            'seniors',
            'Seniors',
        ),
        (
            20,
            'novice',
            'Novice',
        ),
        (
            30,
            'youth',
            'Youth',
        ),
    )

    age = models.IntegerField(
        choices=AGE,
        null=True,
        blank=True,
    )

    is_novice = models.BooleanField(default=False, )

    SIZE = Choices(
        (
            100,
            'p1',
            'Plateau 1',
        ),
        (
            110,
            'p2',
            'Plateau 2',
        ),
        (
            120,
            'p3',
            'Plateau 3',
        ),
        (
            130,
            'p4',
            'Plateau 4',
        ),
        (
            140,
            'pa',
            'Plateau A',
        ),
        (
            150,
            'paa',
            'Plateau AA',
        ),
        (
            160,
            'paaa',
            'Plateau AAA',
        ),
        (
            170,
            'paaaa',
            'Plateau AAAA',
        ),
        (
            180,
            'pb',
            'Plateau B',
        ),
        (
            190,
            'pi',
            'Plateau I',
        ),
        (
            200,
            'pii',
            'Plateau II',
        ),
        (
            210,
            'piii',
            'Plateau III',
        ),
        (
            220,
            'piv',
            'Plateau IV',
        ),
        (
            230,
            'small',
            'Small',
        ),
    )

    size = models.IntegerField(
        choices=SIZE,
        null=True,
        blank=True,
    )

    size_range = IntegerRangeField(
        null=True,
        blank=True,
    )

    SCOPE = Choices(
        (
            100,
            'p1',
            'Plateau 1',
        ),
        (
            110,
            'p2',
            'Plateau 2',
        ),
        (
            120,
            'p3',
            'Plateau 3',
        ),
        (
            130,
            'p4',
            'Plateau 4',
        ),
        (
            140,
            'pa',
            'Plateau A',
        ),
        (
            150,
            'paa',
            'Plateau AA',
        ),
        (
            160,
            'paaa',
            'Plateau AAA',
        ),
        (
            170,
            'paaaa',
            'Plateau AAAA',
        ),
        (
            175,
            'paaaaa',
            'Plateau AAAAA',
        ),
    )

    scope = models.IntegerField(
        choices=SCOPE,
        null=True,
        blank=True,
    )

    scope_range = DecimalRangeField(
        null=True,
        blank=True,
    )

    # Denormalizations
    tree_sort = models.IntegerField(
        unique=True,
        blank=True,
        null=True,
        editable=False,
    )

    # Internals
    objects = AwardManager()

    class Meta:
        pass

    class JSONAPIMeta:
        resource_name = "award"

    def __str__(self):
        return self.name

    def clean(self):
        if self.level == self.LEVEL.qualifier and not self.threshold:
            raise ValidationError({'level': 'Qualifiers must have thresholds'})
        # if self.level != self.LEVEL.qualifier and self.threshold:
        #     raise ValidationError(
        #         {'level': 'Non-Qualifiers must not have thresholds'}
        #     )

    def is_searchable(self):
        return bool(self.status == self.STATUS.active)

    # Award Permissions
    @staticmethod
    @allow_staff_or_superuser
    @authenticated_users
    def has_read_permission(request):
        return True

    @allow_staff_or_superuser
    @authenticated_users
    def has_object_read_permission(self, request):
        return True

    @staticmethod
    @allow_staff_or_superuser
    @authenticated_users
    def has_write_permission(request):
        return request.user.roles.filter(name__in=[
            'SCJC',
        ])

    @allow_staff_or_superuser
    @authenticated_users
    def has_object_write_permission(self, request):
        return request.user.roles.filter(name__in=[
            'SCJC',
        ])

    # Transitions
    @fsm_log_by
    @transition(field=status, source='*', target=STATUS.active)
    def activate(self, *args, **kwargs):
        """Activate the Award."""
        return

    @fsm_log_by
    @transition(field=status, source='*', target=STATUS.inactive)
    def deactivate(self, *args, **kwargs):
        """Deactivate the Award."""
        return