コード例 #1
0
def _idol_sub_unit_to_cuteform(k):
    if float(k) - 2 < 0:
        return staticImageURL(k, folder='i_unit', extension='png')
    elif float(k) - 10 < 0:
        return staticImageURL(int(k) - 2, folder='i_subunit', extension='png')
    else:
        return FAVORITE_CHARACTERS_IMAGES[int(k) - 10]
コード例 #2
0
        def ordering_fields(self, item, only_fields=None, *args, **kwargs):
            fields = super(CardCollection.ListView, self).ordering_fields(item, *args, only_fields=only_fields, **kwargs)
            if 'max_smile' in only_fields:
                fields['max_smile'] = {
                    'verbose_name':  _('Smile'),
                    'value': item.smile_max_idol or item.smile_max or item.smile_min or '???',
                    'type': 'text',
                    'image': staticImageURL('0', folder='i_attribute', extension='png'),
                }
            if 'max_pure' in only_fields:
                fields['max_pure'] = {
                    'verbose_name':  _('Pure'),
                    'value': item.pure_max_idol or item.pure_max or item.pure_min or '???',
                    'type': 'text',
                    'image': staticImageURL('1', folder='i_attribute', extension='png'),
                }
            if 'max_cool' in only_fields:
                fields['max_cool'] = {
                    'verbose_name':  _('Cool'),
                    'value': item.cool_max_idol or item.cool_max or item.cool_min or '???',
                    'type': 'text',
                    'image': staticImageURL('2', folder='i_attribute', extension='png'),
                }

            return fields
コード例 #3
0
def gallery(request):
    ajax = request.path_info.startswith('/ajax/')
    context = ajaxContext(request) if ajax else getGlobalContext(request)
    context['ajax'] = ajax
    context['extends'] = 'base.html' if not context['ajax'] else 'ajax.html'
    context['page_title'] = _('Gallery')

    context['categories'] = [
        {
            'title': details['translation'],
            'url': u'/assets/{}/'.format(type),
            'icon': 'pictures',
            'image': staticImageURL(type, folder='gallery', extension='png'),
        } for i_type, (type, details) in enumerate(models.Asset.TYPES.items())
    ] + [
        {
            'icon': 'present',
            'title': _('Area items'),
            'url': '/areas/',
            'image': staticImageURL('area_items', folder='gallery', extension='png'),
        },
        {
            'icon': 'star',
            'title': _('Items'),
            'url': '/items/',
            'image': staticImageURL('items', folder='gallery', extension='png'),
        },
    ]

    return render(request, 'pages/gallery.html', context)
コード例 #4
0
def bandField(band, i):
    return {
        'image': staticImageURL('mini_band_icon/{}.png'.format(band)),
        'verbose_name': _('Band'),
        'type': 'image_link',
        'link': u'/members/?i_band={}'.format(i),
        'ajax_link': u'/ajax/members/?i_band={}&ajax_modal_only'.format(i),
        'link_text': band,
        'value': staticImageURL('band/{}.png'.format(band)),
    }
コード例 #5
0
    def to_fields(self, view, item, *args, **kwargs):

        fields = super(SongCollection, self).to_fields(view, item, *args, icons=SONGS_ICONS,  images={
                'attribute': staticImageURL(item.i_attribute, folder='i_attribute', extension='png'),
                'unit': staticImageURL(item.i_unit, folder='i_unit', extension='png'),
                'subunit': staticImageURL(item.i_subunit, folder='i_subunit', extension='png'),
        }, **kwargs)

        setSubField(fields, 'b_side_start', key='timezones', value=['Asia/Tokyo', 'Local time'])
        setSubField(fields, 'b_side_end', key='timezones', value=['Asia/Tokyo', 'Local time'])
        setSubField(fields, 'release', key='timezones', value=['Asia/Tokyo', 'Local time'])
        setSubField(fields, 'length', key='value', value=lambda f: item.length_in_minutes)

        return fields
コード例 #6
0
 def to_fields(self, view, item, *args, **kwargs):
     _photo_images = PHOTO_IMAGES.copy()
     _photo_images.update({
         'color':
         staticImageURL(item.color, folder='color', extension='png'),
         'rarity':
         staticImageURL(item.rarity, folder='rarity', extension='png'),
     })
     fields = super(PhotoCollection, self).to_fields(view,
                                                     item,
                                                     *args,
                                                     icons=PHOTO_ICONS,
                                                     images=_photo_images,
                                                     **kwargs)
     return fields
コード例 #7
0
ファイル: models.py プロジェクト: cyberhobbes/MagiCircles
class StaffConfiguration(MagiModel):
    collection_name = 'staffconfiguration'

    owner = models.ForeignKey(User, related_name='added_configurations')
    key = models.CharField(max_length=100)
    verbose_key = models.CharField('Name', max_length=100)
    value = models.TextField('Value', null=True)

    LANGUAGE_CHOICES = django_settings.LANGUAGES
    LANGUAGE_WITHOUT_I_CHOICES = True
    LANGUAGE_SOFT_CHOICES = True
    i_language = models.CharField(_('Language'), max_length=10, null=True)
    language_image_url = property(lambda _s: staticImageURL(_s.language, folder=u'language', extension='png'))

    is_long = models.BooleanField(default=False)
    is_markdown = models.BooleanField(default=False)
    is_boolean = models.BooleanField(default=False)

    # Owner is always pre-selected
    @property
    def cached_owner(self):
        self.owner.unicode = unicode(self.owner)
        return self.owner

    @property
    def boolean_value(self):
        if self.is_boolean:
            if self.value == 'True':
                return True
            if self.value == 'False':
                return False
            return None
        return self.value

    @property
    def representation_value(self):
        if self.is_markdown:
            return u'<div class="list-group-item to-markdown">{}</div>'.format(self.value) if self.value else ''
        elif self.is_boolean:
            if self.value == 'True':
                return u'<i class="flaticon-checked"></i>'
            if self.value == 'False':
                return u'<i class="flaticon-delete"></i>'
            return ''
        return self.value or ''

    @property
    def field_type(self):
        if self.key.endswith('_image_url') or self.key.endswith('_image'):
            return 'image'
        if self.is_markdown or self.is_boolean:
            return 'html'
        return 'text'

    def __unicode__(self):
        return self.verbose_key

    class Meta:
        unique_together = (('key', 'i_language'),)
コード例 #8
0
    def to_fields(self, view, item, *args, **kwargs):

        # Add/Edit view auto-see All-attribute rarity symbols
        #Item/List view see proper attribute v. when known
        if item.attribute:
            rarityfolder='rarity_' + str(item.i_attribute)
        else:
            rarityfolder='rarity_3'

        fields = super(CardCollection, self).to_fields(view, item, *args, icons=CARDS_ICONS,  images={
                'attribute': staticImageURL(item.i_attribute, folder='i_attribute', extension='png'),
                'rarity': staticImageURL(item.i_rarity, folder=rarityfolder, extension='png'),
        }, **kwargs)

        setSubField(fields, 'release', key='timezones', value=['Asia/Tokyo'])
        setSubField(fields, 'card_id', key='type', value='text')
        setSubField(fields, 'card_id', key='value', value=u'#{}'.format(item.card_id))
        return fields
コード例 #9
0
ファイル: generate_settings.py プロジェクト: db0company/c3DeX
def generate_settings():

    print 'Get staff configurations and latest news'
    staff_configurations, latest_news = getStaffConfigurations()

    print 'Show a happy birthday banner for the users whose birthday is today'
    latest_news = getUsersBirthdaysToday(
        staticImageURL('happy_birthday.png'),
        latest_news=latest_news,
        max_usernames=4,
    )

    print 'Cache all CCCs'
    all_cccs = OrderedDict([(ccc.id, {
        'name':
        unicode(ccc),
        't_names':
        getAllTranslations(lambda _language: ccc, unique=True),
        'image_url':
        ccc.image_url,
        'acronym':
        ccc.acronym,
    }) for ccc in models.CCC.objects.all().order_by('-start_date')])

    print 'Links in navbar'
    links_in_navbar = OrderedDict([(link.id, {
        'name':
        unicode(link),
        't_names':
        getAllTranslations(lambda _language: link, unique=True),
        'url':
        link.url,
    }) for link in models.Link.objects.filter(in_navbar=True).order_by('id')])

    print 'Add CCC to latest news'
    recent_cccs = getCurrentEvents(models.CCC.objects.all(),
                                   starts_within=1360,
                                   ends_within=1360)
    # todo not working
    latest_news += [{
        't_titles': getAllTranslations(lambda _language: item),
        'image': ccc.image_url,
        'url': ccc.item_url,
    } for ccc in recent_cccs]

    print 'Save generated settings'
    generateSettings(
        {
            'LATEST_NEWS': latest_news,
            'STAFF_CONFIGURATIONS': staff_configurations,
            'CCCS': all_cccs,
            'LINKS_IN_NAVBAR': links_in_navbar,
        },
        imports=[
            'from collections import OrderedDict',
        ])
コード例 #10
0
def generateDifficulty(difficulty):
    note_image = staticImageURL('note.png')
    return u'{big_images}{small_images}'.format(
        big_images=(
            u'<img src="{}" class="song-big-note">'.format(note_image) *
            (difficulty // 5)),
        small_images=(
            u'<img src="{}" class="song-small-note">'.format(note_image) *
            (difficulty % 5)),
    )
コード例 #11
0
    def to_fields(self, view, item, *args, **kwargs):

        fields = super(IdolCollection, self).to_fields(view, item, *args, icons=IDOLS_ICONS,  images={
                'attribute': staticImageURL(item.i_attribute, folder='i_attribute', extension='png'),
                'unit': staticImageURL(item.i_unit, folder='i_unit', extension='png'),
                'subunit': staticImageURL(item.i_subunit, folder='i_subunit', extension='png'),
                'astrological_sign': staticImageURL(
                    item.i_astrological_sign,
                    folder='i_astrological_sign',
                    extension='png',
                ),
        }, **kwargs)

        if item.japanese_name and get_language() == 'ja':
            setSubField(fields, 'name', key='value', value=item.japanese_name)

        setSubField(fields, 'birthday', key='type', value='text')
        setSubField(fields, 'birthday', key='value', value=lambda f: date_format(item.birthday, format='MONTH_DAY_FORMAT', use_l10n=True))

        return fields
コード例 #12
0
ファイル: views.py プロジェクト: MagiCircles/BanGDream
def gallery(request, context):
    context['categories'] = [
        {
            'title': details['translation'],
            'url': u'/assets/{}/'.format(type),
            'icon': 'pictures',
            'image': staticImageURL(type, folder='gallery', extension='png'),
        } for i_type, (type, details) in enumerate(models.Asset.TYPES.items())
    ] + [
        {
            'icon': 'present',
            'title': _('Area items'),
            'url': '/areas/',
            'image': staticImageURL('area_items', folder='gallery', extension='png'),
        },
        {
            'icon': 'star',
            'title': _('Items'),
            'url': '/items/',
            'image': staticImageURL('items', folder='gallery', extension='png'),
        },
    ]
コード例 #13
0
def memberBandMergeCuteForm(cuteform):
    mergedFieldCuteForm(
        cuteform, {
            'title': string_concat(_('Member'), '/', _('Band')),
            'extra_settings': {
                'modal': 'true',
                'modal-text': 'true',
            },
        },
        OrderedDict([
            ('member', lambda k, v: FAVORITE_CHARACTERS_IMAGES[int(k)]),
            ('i_band',
             lambda k, v: staticImageURL(v, folder='band', extension='png')),
        ]))
コード例 #14
0
        def to_fields(self, item, order=None, extra_fields=None, exclude_fields=None, *args, **kwargs):
            if extra_fields is None: extra_fields = []
            if exclude_fields is None: exclude_fields = []
            if order is None: order = []

            values = []
            for fieldName, verbose_name in models.Idol.MEASUREMENT_DETAILS:
                value = getattr(item, fieldName)
                exclude_fields.append(fieldName)
                if value:
                    values.append(mark_safe(u'<b>{}</b>: {} cm'.format(verbose_name, value)))
            if values:
                extra_fields.append(('measurements', {
                    'verbose_name': _('Measurements'),
                    'type': 'list',
                    'value': values,
                    'icon': 'measurements',
                    }))
            if item.school is not None:
                exclude_fields.append('i_year')
            if item.birthday is not None:
                exclude_fields += ['age', 'i_astrological_sign']
            exclude_fields.append('japanese_name')
            order = IDOL_ORDER + order

            fields = super(IdolCollection.ItemView, self).to_fields(item, *args, order=order, extra_fields=extra_fields, exclude_fields=exclude_fields, **kwargs)

            if item.birthday:
                if item.astrological_sign is not None:
                    setSubField(fields, 'birthday', key='icon', value=None)
                    setSubField(fields, 'birthday', key='image', value=staticImageURL(item.i_astrological_sign, folder='i_astrological_sign', extension='png'))
                if item.age:
                    setSubField(fields, 'birthday', key='type', value='text_annotation')
                    setSubField(fields, 'birthday', key='annotation', value=_('{age} years old').format(age=item.age))

            if item.school and item.year:
                    setSubField(fields, 'school', key='type', value='title_text')
                    setSubField(fields, 'school', key='title', value=item.t_school)
                    setSubField(fields, 'school', key='value', value='{}'.format(unicode(item.t_year)))

            setSubField(fields, 'description', key='type', value='long_text')

            if item.japanese_name:
                if get_language() == 'ja':
                    setSubField(fields, 'name', key='value', value=item.japanese_name)
                else:
                    setSubField(fields, 'name', key='type', value='text_annotation')
                    setSubField(fields, 'name', key='annotation', value=item.japanese_name)

            return fields
コード例 #15
0
ファイル: utils.py プロジェクト: dwy6626/BanGDream
def memberBandMergeCuteForm(cuteform):
    mergedFieldCuteForm(
        cuteform, {
            'title': string_concat(_('Member'), '/', _('Band')),
            'extra_settings': {
                'modal': 'true',
                'modal-text': 'true',
            },
        },
        OrderedDict([
            ('member', lambda k, v: getCharacterImageFromPk(int(k))),
            ('i_band',
             lambda k, v: staticImageURL(v, folder='band', extension='png')),
        ]))
コード例 #16
0
 def to_fields(self, item, images=None, *args, **kwargs):
     if images is None: images = {}
     images.update({
         'website':
         item.website_image,
         'groups':
         staticImageURL(item.groups[0],
                        folder='groups',
                        extension='png') if item.groups else None,
     })
     fields = super(AccountCollection.ItemView,
                    self).to_fields(item,
                                    *args,
                                    images=images,
                                    **kwargs)
     setSubField(fields, 'website', key='type', value=u'link')
     setSubField(fields, 'website', key='value', value=item.website_url)
     setSubField(fields, 'website', key='link_text', value=item.website)
     return fields
コード例 #17
0
    def to_fields(self, view, item, *args, **kwargs):

        fields = super(SIFEventCollection, self).to_fields(view, item, *args, icons=EVENTS_ICONS,  images={
                'unit': staticImageURL(item.i_unit, folder='i_unit', extension='png'),
        }, **kwargs)

        setSubField(fields, 'jp_start_date', key='timezones', value=['Asia/Tokyo', 'Local time'])
        setSubField(fields, 'jp_end_date', key='timezones', value=['Asia/Tokyo', 'Local time'])

        setSubField(fields, 'ww_start_date', key='timezones', value=['UTC', 'Local time'])
        setSubField(fields, 'ww_end_date', key='timezones', value=['UTC', 'Local time'])

        setSubField(fields, 'tw_start_date', key='timezones', value=['Asia/Taipei', 'Local time'])
        setSubField(fields, 'tw_end_date', key='timezones', value=['Asia/Taipei', 'Local time'])

        setSubField(fields, 'kr_start_date', key='timezones', value=['Asia/Seoul', 'Local time'])
        setSubField(fields, 'kr_end_date', key='timezones', value=['Asia/Seoul', 'Local time'])

        setSubField(fields, 'cn_start_date', key='timezones', value=['UTC', 'Local time'])
        setSubField(fields, 'cn_end_date', key='timezones', value=['UTC', 'Local time'])

        return fields
コード例 #18
0
def bangGlobalContext(request):
    context = globalContext(request)
    # Change font depending on language
    if context['current_language'] in FONTS_PER_LANGUAGE:
        f = FONTS_PER_LANGUAGE[context['current_language']]
        if 'name' in f and 'url' in f:
            context['extracss'] = context.get(
                'extracss', '') + u'\n        @import url({url});{title_url}\n\
        body {{ font-family: \'{name}\', sans-serif; }}\n        {css_classes} {{ font-family: \'{title_name}\', monospace;{title_weight} }}'.format(
                    url=f['url'],
                    title_url=(u'\n@import url({url});'.format(
                        url=f['title_url']) if 'title_url' in f else ''),
                    name=f['name'],
                    css_classes=TITLE_CSS_CLASSES,
                    title_name=f.get('title', f['name']),
                    title_weight=(u' font-weight: {weight};'.format(
                        weight=f['title_weight'])
                                  if 'title_weight' in f else ''),
                )
    for popup_name, popup in context.get('corner_popups', {}).items():
        popup['image_overflow'] = True
        if popup_name == 'happy_birthday':
            popup['image'] = staticImageURL('birthday_kanae.png')
    return context
コード例 #19
0
ファイル: models.py プロジェクト: cyberhobbes/MagiCircles
 def rank_image_url(self):
     return staticImageURL(u'medal{}'.format(self.rank), folder='badges', extension='png')
コード例 #20
0
def _get_share_image(context, collection_view, item=None):
    return staticImageURL(collection_view.share_image(context, item), full=True)
コード例 #21
0
RAW_CONTEXT['collectible_collections'] = collectible_collections
RAW_CONTEXT['account_model'] = ACCOUNT_MODEL
RAW_CONTEXT['site_name'] = SITE_NAME
RAW_CONTEXT['site_name_per_language'] = SITE_NAME_PER_LANGUAGE
RAW_CONTEXT['site_url'] = SITE_URL
RAW_CONTEXT['github_repository'] = GITHUB_REPOSITORY
RAW_CONTEXT['site_description'] = SITE_DESCRIPTION
RAW_CONTEXT['staff_configurations'] = STAFF_CONFIGURATIONS
RAW_CONTEXT['get_started_video'] = GET_STARTED_VIDEO
RAW_CONTEXT['game_name'] = GAME_NAME
RAW_CONTEXT['static_uploaded_files_prefix'] = STATIC_UPLOADED_FILES_PREFIX
RAW_CONTEXT['static_url'] = SITE_STATIC_URL + 'static/'
RAW_CONTEXT['static_files_version'] = STATIC_FILES_VERSION
RAW_CONTEXT['empty_image'] = EMPTY_IMAGE
RAW_CONTEXT['full_static_url'] = u'http{}:{}'.format('' if settings.DEBUG else 's', RAW_CONTEXT['static_url']) if 'http' not in RAW_CONTEXT['static_url'] else RAW_CONTEXT['static_url']
RAW_CONTEXT['site_logo'] = staticImageURL(SITE_LOGO)
RAW_CONTEXT['full_site_logo'] = u'http{}:{}'.format('' if settings.DEBUG else 's',RAW_CONTEXT['site_logo']) if 'http' not in RAW_CONTEXT['site_logo'] else RAW_CONTEXT['site_logo']
RAW_CONTEXT['site_nav_logo'] = SITE_NAV_LOGO
RAW_CONTEXT['disqus_shortname'] = DISQUS_SHORTNAME
RAW_CONTEXT['javascript_translated_terms'] = JAVASCRIPT_TRANSLATED_TERMS
RAW_CONTEXT['javascript_commons'] = JAVASCRIPT_COMMONS
RAW_CONTEXT['site_color'] = COLOR
RAW_CONTEXT['site_image'] = staticImageURL(SITE_IMAGE)
RAW_CONTEXT['site_image_per_language'] = { _l: staticImageURL(_url) for _l, _url in SITE_IMAGE_PER_LANGUAGE.items() }
RAW_CONTEXT['full_site_image'] = u'http{}:{}'.format('' if settings.DEBUG else 's',RAW_CONTEXT['site_image']) if 'http' not in RAW_CONTEXT['site_image'] else RAW_CONTEXT['site_image']
RAW_CONTEXT['full_site_image_per_language'] = { _l: (u'http:{}'.format(_url) if 'http' not in _url else _url) for _l, _url in RAW_CONTEXT['site_image_per_language'].items() }
RAW_CONTEXT['email_image'] = staticImageURL(EMAIL_IMAGE if EMAIL_IMAGE else SITE_IMAGE)
RAW_CONTEXT['email_image_per_language'] = { _l: staticImageURL(_url) for _l, _url in EMAIL_IMAGE_PER_LANGUAGE.items() }
RAW_CONTEXT['full_email_image'] = u'http{}:{}'.format('' if settings.DEBUG else 's',RAW_CONTEXT['email_image']) if 'http' not in RAW_CONTEXT['email_image'] else RAW_CONTEXT['email_image']
RAW_CONTEXT['full_email_image_per_language'] = { _l: (u'http:{}'.format(_url) if 'http' not in _url else _url) for _l, _url in RAW_CONTEXT['email_image_per_language'].items() }
RAW_CONTEXT['translation_help_url'] = TRANSLATION_HELP_URL
コード例 #22
0
ファイル: urls.py プロジェクト: NanduTej/MagiCircles
RAW_CONTEXT['site_name'] = SITE_NAME
RAW_CONTEXT['site_name_per_language'] = SITE_NAME_PER_LANGUAGE
RAW_CONTEXT['site_url'] = SITE_URL
RAW_CONTEXT['github_repository'] = GITHUB_REPOSITORY
RAW_CONTEXT['site_description'] = SITE_DESCRIPTION
RAW_CONTEXT['staff_configurations'] = STAFF_CONFIGURATIONS
RAW_CONTEXT['get_started_video'] = GET_STARTED_VIDEO
RAW_CONTEXT['game_name'] = GAME_NAME
RAW_CONTEXT['static_uploaded_files_prefix'] = STATIC_UPLOADED_FILES_PREFIX
RAW_CONTEXT['static_url'] = SITE_STATIC_URL + 'static/'
RAW_CONTEXT['static_files_version'] = STATIC_FILES_VERSION
RAW_CONTEXT['empty_image'] = EMPTY_IMAGE
RAW_CONTEXT['full_static_url'] = u'http{}:{}'.format(
    '' if settings.DEBUG else 's', RAW_CONTEXT['static_url']
) if 'http' not in RAW_CONTEXT['static_url'] else RAW_CONTEXT['static_url']
RAW_CONTEXT['site_logo'] = staticImageURL(SITE_LOGO)
RAW_CONTEXT['full_site_logo'] = u'http{}:{}'.format(
    '' if settings.DEBUG else 's', RAW_CONTEXT['site_logo']
) if 'http' not in RAW_CONTEXT['site_logo'] else RAW_CONTEXT['site_logo']
RAW_CONTEXT['site_nav_logo'] = SITE_NAV_LOGO
RAW_CONTEXT['disqus_shortname'] = DISQUS_SHORTNAME
RAW_CONTEXT['javascript_translated_terms'] = JAVASCRIPT_TRANSLATED_TERMS
RAW_CONTEXT['javascript_commons'] = JAVASCRIPT_COMMONS
RAW_CONTEXT['site_color'] = COLOR
RAW_CONTEXT['site_image'] = staticImageURL(SITE_IMAGE)
RAW_CONTEXT['site_image_per_language'] = {
    _l: staticImageURL(_url)
    for _l, _url in SITE_IMAGE_PER_LANGUAGE.items()
}
RAW_CONTEXT['full_site_image'] = u'http{}:{}'.format(
    '' if settings.DEBUG else 's', RAW_CONTEXT['site_image']
コード例 #23
0
    class BaseEventWithVersions(_BaseEvent):

        ############################################################
        # Versions

        FIELDS_PER_VERSION = ['image', 'start_date', 'end_date']

        VERSIONS = versions
        VERSIONS_CHOICES = [(_name, _info['translation'])
                            for _name, _info in VERSIONS.items()]
        c_versions = models.TextField(
            _('Server availability'),
            blank=True,
            null=True,
            default=u'"{}"'.format(versions.keys()[0]),
        )

        ############################################################
        # Utils

        # Pick version automatically

        @property
        def relevant_version(self):
            return getRelevantVersion(item=self)

        def get_relevant_name(self, return_version=False):
            return self.get_translated_value_for_relevant_version(
                'name',
                return_version=return_version,
                default=default_name()
                if callable(default_name) else default_name,
            )

        relevant_name = property(get_relevant_name)

        image = property(lambda _s: _s.relevant_image)

        def get_field_for_relevant_version(self,
                                           field_name,
                                           default=None,
                                           get_value=None,
                                           return_version=False,
                                           fallback=True):
            return getFieldForRelevantVersion(
                self,
                field_name,
                default=default,
                get_value=get_value,
                return_version=return_version,
                fallback=fallback,
            )

        def get_translated_value_for_relevant_version(self,
                                                      field_name,
                                                      default=None,
                                                      return_version=False):
            return getTranslatedValueForRelevantVersion(
                self,
                field_name,
                default=default,
                return_version=return_version)

        # Specify version

        get_name_for_version = lambda _s, _v: _s.get_relevant_translated_value_for_version(
            'name', _v)

        def get_field_for_version(self,
                                  field_name,
                                  version_name,
                                  get_value=None):
            return getFieldForVersion(self,
                                      field_name,
                                      version_name,
                                      self.VERSIONS[version_name],
                                      get_value=get_value)

        def get_status_for_version(self, version_name):
            return getEventStatus(
                self.get_field_for_version('start_date', version_name),
                self.get_field_for_version('end_date', version_name),
            )

        def get_translated_values_for_version(self, field_name, version_name):
            return getTranslatedValuesForVersion(self, field_name,
                                                 self.VERSIONS[version_name])

        def get_relevant_translated_value_for_version(self,
                                                      field_name,
                                                      version_name,
                                                      fallback=False,
                                                      default=None):
            return getRelevantTranslatedValueForVersion(
                self,
                field_name,
                version_name,
                self.VERSIONS[version_name],
                fallback=fallback,
                default=default,
            )

        ############################################################
        # Class utils

        get_version_name = classmethod(
            lambda _s, _v: _s.get_version_info(_v, 'translation'))
        get_version_image = classmethod(
            lambda _s, _v: staticImageURL(_s.get_version_info(_v, 'image')))
        get_version_icon = classmethod(
            lambda _s, _v: _s.get_version_info(_v, 'icon'))

        @classmethod
        def get_field_name_for_version(self, field_name, version_name):
            return getFieldNameForVersion(field_name,
                                          self.VERSIONS[version_name])

        @classmethod
        def get_field_names_all_versions(self, field_name):
            return [
                self.get_field_name_for_version(field_name, version_name)
                for version_name in self.VERSIONS.keys()
            ]

        @classmethod
        def get_version_languages(self, version_name):
            return getLanguagesForVersion(self.VERSIONS[version_name])

        @classmethod
        def get_version_info(self, version_name, field_name, default=None):
            return self.VERSIONS[version_name].get(field_name, default)

        ############################################################
        # Views utils

        @property
        def top_image(self):
            return self.relevant_image_url

        ############################################################
        # Utility method get_{}_for_version for all fields

        def __getattr__(self, name):
            if name.startswith('get_') and name.endswith('_for_version'):
                return lambda version_name: self.get_field_for_version(
                    name[len('get_'):len('_for_version') * -1],
                    version_name,
                )
            elif name.startswith('get_relevant_'):
                field_name = name[len('get_relevant_'):]
                default = defaults.get(field_name, None)
                fallback = fallbacks.get(field_name, True)
                return lambda _self, return_version=False: _self.get_field_for_relevant_version(
                    field_name,
                    default=default() if callable(default) else default,
                    return_version=return_version,
                    fallback=fallback,
                )
            elif name.startswith('relevant_'):
                return getattr(
                    self,
                    u'get_relevant_{}'.format(name[len('relevant_'):]))(self)
            return super(BaseEventWithVersions, self).__getattr__(name)

        ############################################################
        # Unicode

        def __unicode__(self):
            return unicode(self.relevant_name or _('Event'))

        class Meta(MagiModel.Meta):
            abstract = True
コード例 #24
0
def map(request):
    context = mapDefaultContext(request)
    context['share_image'] = staticImageURL('screenshots/map.png')
    return render(request, 'pages/map.html', context)
コード例 #25
0
ファイル: urls.py プロジェクト: odaibaka/MagiCircles
RAW_CONTEXT['account_model'] = ACCOUNT_MODEL
RAW_CONTEXT['site_name'] = SITE_NAME
RAW_CONTEXT['site_name_per_language'] = SITE_NAME_PER_LANGUAGE
RAW_CONTEXT['site_url'] = SITE_URL
RAW_CONTEXT['github_repository'] = GITHUB_REPOSITORY
RAW_CONTEXT['site_description'] = SITE_DESCRIPTION
RAW_CONTEXT['staff_configurations'] = STAFF_CONFIGURATIONS
RAW_CONTEXT['get_started_video'] = GET_STARTED_VIDEO
RAW_CONTEXT['game_name'] = GAME_NAME
RAW_CONTEXT['game_name_per_language'] = GAME_NAME_PER_LANGUAGE
RAW_CONTEXT['static_uploaded_files_prefix'] = STATIC_UPLOADED_FILES_PREFIX
RAW_CONTEXT['static_url'] = SITE_STATIC_URL + 'static/'
RAW_CONTEXT['static_files_version'] = STATIC_FILES_VERSION
RAW_CONTEXT['empty_image'] = EMPTY_IMAGE
RAW_CONTEXT['full_static_url'] = u'http{}:{}'.format('' if settings.DEBUG else 's', RAW_CONTEXT['static_url']) if 'http' not in RAW_CONTEXT['static_url'] else RAW_CONTEXT['static_url']
RAW_CONTEXT['site_logo'] = staticImageURL(SITE_LOGO)
RAW_CONTEXT['full_site_logo'] = u'http{}:{}'.format('' if settings.DEBUG else 's',RAW_CONTEXT['site_logo']) if 'http' not in RAW_CONTEXT['site_logo'] else RAW_CONTEXT['site_logo']
RAW_CONTEXT['site_nav_logo'] = SITE_NAV_LOGO
RAW_CONTEXT['comments_engine'] = COMMENTS_ENGINE
if RAW_CONTEXT['comments_engine'] == 'disqus':
    RAW_CONTEXT['disqus_shortname'] = DISQUS_SHORTNAME
RAW_CONTEXT['max_activity_height'] = MAX_ACTIVITY_HEIGHT
RAW_CONTEXT['javascript_translated_terms'] = JAVASCRIPT_TRANSLATED_TERMS
RAW_CONTEXT['javascript_commons'] = JAVASCRIPT_COMMONS
RAW_CONTEXT['site_color'] = COLOR
RAW_CONTEXT['site_image'] = staticImageURL(SITE_IMAGE)
RAW_CONTEXT['site_image_per_language'] = { _l: staticImageURL(_url) for _l, _url in SITE_IMAGE_PER_LANGUAGE.items() }
RAW_CONTEXT['full_site_image'] = u'http{}:{}'.format('' if settings.DEBUG else 's',RAW_CONTEXT['site_image']) if 'http' not in RAW_CONTEXT['site_image'] else RAW_CONTEXT['site_image']
RAW_CONTEXT['full_site_image_per_language'] = { _l: (u'http:{}'.format(_url) if 'http' not in _url else _url) for _l, _url in RAW_CONTEXT['site_image_per_language'].items() }
RAW_CONTEXT['email_image'] = staticImageURL(EMAIL_IMAGE if EMAIL_IMAGE else SITE_IMAGE)
RAW_CONTEXT['email_image_per_language'] = { _l: staticImageURL(_url) for _l, _url in EMAIL_IMAGE_PER_LANGUAGE.items() }
コード例 #26
0
ファイル: magi_tags.py プロジェクト: odaibaka/MagiCircles
def static_image_url(*args, **kwargs):
    return staticImageURL(**kwargs)
コード例 #27
0
ファイル: urls.py プロジェクト: odaibaka/MagiCircles
    def _view(request, *args, **kwargs):
        # Check permissions
        permissions_context = { 'current_url': request.get_full_path() }
        if page.get('logout_required', False) and request.user.is_authenticated():
            raise PermissionDenied()
        if page.get('authentication_required'):
            redirectWhenNotAuthenticated(request, permissions_context, next_title=page.get('title', ''))
        if page.get('staff_required', False):
            redirectWhenNotAuthenticated(request, permissions_context, next_title=page.get('title', ''))
            if not request.user.is_staff and not request.user.is_superuser:
                raise PermissionDenied()
        if page.get('prelaunch_staff_required', False):
            redirectWhenNotAuthenticated(request, permissions_context, next_title=page.get('title', ''))
            if not request.user.hasPermission('access_site_before_launch'):
                raise PermissionDenied()
        if page.get('permissions_required', []):
            redirectWhenNotAuthenticated(request, permissions_context, next_title=page.get('title', ''))
            if not hasPermissions(request.user, page['permissions_required']):
                raise PermissionDenied()
        if page.get('one_of_permissions_required', []):
            redirectWhenNotAuthenticated(request, permissions_context, next_title=page.get('title', ''))
            if not hasOneOfPermissions(request.user, page['one_of_permissions_required']):
                raise PermissionDenied()

        if boilerplate:
            # Context
            context = getGlobalContext(request=request)
            context['extends'] = 'base.html' if not context['ajax'] else 'ajax.html'
            context['disqus_identifier'] = context['current']
            # Settings from page
            context['show_small_title'] = page.get('show_small_title', True)
            context['show_title'] = page.get('show_title', False)
            context['share_image'] = staticImageURL(page.get('share_image', None))
            context['page_description'] = page.get('page_description', None)
            context['comments_enabled'] = page.get('comments_enabled', False)
            context['template'] = page.get('template', name)
            # Set title and prefixes
            context['title_prefixes'] = []
            if 'navbar_link_list' in page:
                getNavbarPrefix(page['navbar_link_list'], request, context, append_to=context['title_prefixes'])
            default_page_title = page.get('title', None)
            if callable(default_page_title):
                default_page_title = default_page_title(context)
            h1 = {
                'title': default_page_title,
                'icon': page.get('icon', None),
                'image': page.get('image', None),
            }
            h1ToContext(h1, context)
            context['page_title'] = pageTitleFromPrefixes(context['title_prefixes'], default_page_title)
            # Call function
            if function:
                result = function(request, context, *args, **kwargs)
            # Render with full template
            if page.get('full_template', False):
                return render(request, u'pages/{}.html'.format(
                    name if page['full_template'] == True else page['full_template']), context)
            # Render with boilerplate
            if page.get('as_json', False):
                if result is None:
                    return HttpResponse('')
                return JsonResponse(result)
            elif page.get('as_form', False):
                return render(request, 'form.html', context)
            elif page.get('as_sidebar', False):
                context['sidebar_show_title'] = True
                context['sidebar_template'] = 'include/{}.html'.format(
                    page.get('sidebar_template', '{}_sidebar'.format(name)))
                context['template'] = 'pages/{}.html'.format(context['template'])
                return render(request, 'sidebar.html', context)
            return render(request, 'pages/boilerplate.html', context)
        else:
            # Render expected to be called by function
            return function(request, *args, **kwargs)
コード例 #28
0
def getSchoolImageFromPk(pk):
    return django_settings.SCHOOLS[int(pk)]['image'] or staticImageURL('default/default_school.png')
コード例 #29
0
        def to_fields(self, item, order=None, extra_fields=None, exclude_fields=None, *args, **kwargs):
            if extra_fields is None: extra_fields = []
            if exclude_fields is None: exclude_fields = []
            if order is None: order = []              

            values = u' '
            for fieldName, verbose_name in models.Song.SONGWRITERS:
                value = getattr(item, fieldName)
                exclude_fields.append(fieldName)
                if value:
                    values+=u'<b>{}:</b> {}<br />'.format(verbose_name, value)
            if values and values is not u' ':
                extra_fields.append(('songwriters', {
                    'verbose_name': _('Songwriters'),
                    'type': 'html',
                    'value': mark_safe(u'<div class="songwriters-details">{}</div>'.format(values)),
                    'icon': 'id',
                    }))                
  
            status = getattr(item, 'status')
            if status and status != 'ended':
                start_date = getattr(item, 'b_side_start')
                end_date = getattr(item, 'b_side_end')
                if item.b_side_master is True:
                    verbose = string_concat(_('B-Side'), ' - ', _('Countdown'), '  (MASTER)')
                else:
                    verbose = string_concat(_('B-Side'), ' - ', _('Countdown'))
                extra_fields += [
                    ('countdown', {
                        'verbose_name': verbose,
                        'value': mark_safe(u'<span class="fontx1-5 countdown" data-date="{date}" data-format="{sentence}"></h4>').format(
                            date=torfc2822(end_date if status == 'current' else start_date),
                            sentence=_('{time} left') if status == 'current' else _('Starts in {time}'),
                        ),
                        
                        'icon': 'hourglass',
                        'type': 'html',
                    }),
                    ]
                  
            else:
                exclude_fields.append('b_side_start')
                exclude_fields.append('b_side_end')

            available = getattr(item, 'available')
            if available == True:
                av_value = True
            else:
                av_value = False
            extra_fields += [
                ('availability', {
                    'verbose_name': _('Currently available'),
                    'value': av_value,
                    'icon': 'help',
                    'type': 'bool',
                }),
            ]

            for difficulty, d_verbose in models.Song.DIFFICULTIES:
                difficulties = u' '
                difficultystar = u'{}_difficulty'.format(difficulty)
                difficultynote = u'{}_notes'.format(difficulty)
                difficultystars = getattr(item, difficultystar)
                difficultynotes = getattr(item, difficultynote)
                temps = u'{} &#9734 rating'.format(difficultystars)
                tempn = u'{} notes'.format(difficultynotes)
                if difficultystars:
                    if difficultynotes:
                        difficulties += u'{}<br />{}'.format(temps, tempn)
                        if difficulty is 'master' and item.master_swipe is True:
                            difficulties += u'<br />{}'.format(_('with SWIPE notes'))
                    else:
                        difficulties += u'{}'.format(temps)
                elif difficultynotes:
                    difficulties += u'{}'.format(tempn)
                    if difficulty is 'master' and item.master_swipe is True:
                            difficulties += u'<br />{}'.format(_('with SWIPE notes'))
                if difficulties is not u' ':
                    extra_fields.append((difficulty, {
                    'verbose_name': d_verbose,
                    'type': 'html',
                    'value': difficulties,
                    }))
                exclude_fields.append(difficulty)
                exclude_fields.append(difficultynote)
                exclude_fields.append(difficultystar)

            exclude_fields.append('title')
            exclude_fields.append('romaji')
            exclude_fields.append('cover')
            exclude_fields.append('i_attribute')
            exclude_fields.append('i_unit')
            exclude_fields.append('i_subunit')
            exclude_fields.append('c_locations')
            exclude_fields.append('b_side_master')
            exclude_fields.append('master_swipe')
            
            order = ['itunes_id', 'length', 'bpm', 'c_versions', 'availability', 'unlock',
                     'daily', 'countdown', 'b_side_start', 'b_side_end', 'easy', 'normal', 'hard', 'expert',
                     'master', 'songwriters', 'release'] + order

            fields = super(SongCollection.ItemView, self).to_fields(
                item, *args, order=order, extra_fields=extra_fields, exclude_fields=exclude_fields, **kwargs)

            if item.romaji and item.romaji != item.title:
                setSubField(fields, 'title', key='type', value='title_text')
                setSubField(fields, 'title', key='title', value=item.title)
                setSubField(fields, 'title', key='value', value=item.romaji)

            setSubField(fields, 'unlock', key='type', value='text')
            setSubField(fields, 'unlock', key='value', value=u'Rank {}'.format(item.unlock))

            setSubField(fields, 'easy', key='image', value=staticImageURL('easy', folder='difficulty', extension='png'))
            setSubField(fields, 'normal', key='image', value=staticImageURL('normal', folder='difficulty', extension='png'))
            setSubField(fields, 'hard', key='image', value=staticImageURL('hard', folder='difficulty', extension='png'))
            setSubField(fields, 'expert', key='image', value=staticImageURL('expert', folder='difficulty', extension='png'))
            setSubField(fields, 'master', key='image', value=staticImageURL('master', folder='difficulty', extension='png'))

            return fields
コード例 #30
0
def _get_share_image(context, collection_view, item=None):
    return staticImageURL(collection_view.share_image(context, item),
                          full=True)
コード例 #31
0
class SongCollection(MagiCollection):
    queryset = models.Song.objects.all()
    title = _('Song')
    plural_title = _('Songs')
    multipart = True
    form_class = forms.SongForm
    reportable = False
    blockable = False
    translated_fields = ('title', )
    icon = 'song'
    navbar_link_list = 'lovelive'

    _version_images = { _k: _v['image'] for _k, _v in models.Account.VERSIONS.items() }
    _version_prefixes = { _k: _v['prefix'] for _k, _v in models.Account.VERSIONS.items() }
    _location_to_cuteform = {
        'hits': 'deck',
        'daily': 'trade',
        'bside': 'times',
    }

    filter_cuteform = {
        'i_attribute': {
        },
        'i_unit': {
        },
        'i_subunit': {
            'image_folder': 'i_subunit',
            'title': _('Subunit'),
            'extra_settings': {
                'modal': 'true',
                'modal-text': 'true',
            },
        },
        'version': {
            'to_cuteform': lambda k, v: SongCollection._version_images[k],
            'image_folder': 'language',
            'transform': CuteFormTransform.ImagePath,
        },
        'available': {
            'type': CuteFormType.YesNo,
        },
        'location': {
            'transform': CuteFormTransform.Flaticon,
            'to_cuteform': lambda k, v: SongCollection._location_to_cuteform[k],
        },
        'sub_unit': {
            'to_cuteform': lambda k, v: (
                staticImageURL(k, folder='i_unit', extension='png') if float(k) - 2 < 0 else
                staticImageURL(int(k) - 2, folder='i_subunit', extension='png')
                ),
            'title': _('Unit'),
            'extra_settings': {
                'modal': 'true',
                'modal-text': 'true',
            },
        }, 
    }

    def to_fields(self, view, item, *args, **kwargs):

        fields = super(SongCollection, self).to_fields(view, item, *args, icons=SONGS_ICONS,  images={
                'attribute': staticImageURL(item.i_attribute, folder='i_attribute', extension='png'),
                'unit': staticImageURL(item.i_unit, folder='i_unit', extension='png'),
                'subunit': staticImageURL(item.i_subunit, folder='i_subunit', extension='png'),
        }, **kwargs)

        setSubField(fields, 'b_side_start', key='timezones', value=['Asia/Tokyo', 'Local time'])
        setSubField(fields, 'b_side_end', key='timezones', value=['Asia/Tokyo', 'Local time'])
        setSubField(fields, 'release', key='timezones', value=['Asia/Tokyo', 'Local time'])
        setSubField(fields, 'length', key='value', value=lambda f: item.length_in_minutes)

        return fields

    class ItemView(MagiCollection.ItemView):
        top_illustration = 'include/topSongItem'
        
        def to_fields(self, item, order=None, extra_fields=None, exclude_fields=None, *args, **kwargs):
            if extra_fields is None: extra_fields = []
            if exclude_fields is None: exclude_fields = []
            if order is None: order = []              

            values = u' '
            for fieldName, verbose_name in models.Song.SONGWRITERS:
                value = getattr(item, fieldName)
                exclude_fields.append(fieldName)
                if value:
                    values+=u'<b>{}:</b> {}<br />'.format(verbose_name, value)
            if values and values is not u' ':
                extra_fields.append(('songwriters', {
                    'verbose_name': _('Songwriters'),
                    'type': 'html',
                    'value': mark_safe(u'<div class="songwriters-details">{}</div>'.format(values)),
                    'icon': 'id',
                    }))                
  
            status = getattr(item, 'status')
            if status and status != 'ended':
                start_date = getattr(item, 'b_side_start')
                end_date = getattr(item, 'b_side_end')
                if item.b_side_master is True:
                    verbose = string_concat(_('B-Side'), ' - ', _('Countdown'), '  (MASTER)')
                else:
                    verbose = string_concat(_('B-Side'), ' - ', _('Countdown'))
                extra_fields += [
                    ('countdown', {
                        'verbose_name': verbose,
                        'value': mark_safe(u'<span class="fontx1-5 countdown" data-date="{date}" data-format="{sentence}"></h4>').format(
                            date=torfc2822(end_date if status == 'current' else start_date),
                            sentence=_('{time} left') if status == 'current' else _('Starts in {time}'),
                        ),
                        
                        'icon': 'hourglass',
                        'type': 'html',
                    }),
                    ]
                  
            else:
                exclude_fields.append('b_side_start')
                exclude_fields.append('b_side_end')

            available = getattr(item, 'available')
            if available == True:
                av_value = True
            else:
                av_value = False
            extra_fields += [
                ('availability', {
                    'verbose_name': _('Currently available'),
                    'value': av_value,
                    'icon': 'help',
                    'type': 'bool',
                }),
            ]

            for difficulty, d_verbose in models.Song.DIFFICULTIES:
                difficulties = u' '
                difficultystar = u'{}_difficulty'.format(difficulty)
                difficultynote = u'{}_notes'.format(difficulty)
                difficultystars = getattr(item, difficultystar)
                difficultynotes = getattr(item, difficultynote)
                temps = u'{} &#9734 rating'.format(difficultystars)
                tempn = u'{} notes'.format(difficultynotes)
                if difficultystars:
                    if difficultynotes:
                        difficulties += u'{}<br />{}'.format(temps, tempn)
                        if difficulty is 'master' and item.master_swipe is True:
                            difficulties += u'<br />{}'.format(_('with SWIPE notes'))
                    else:
                        difficulties += u'{}'.format(temps)
                elif difficultynotes:
                    difficulties += u'{}'.format(tempn)
                    if difficulty is 'master' and item.master_swipe is True:
                            difficulties += u'<br />{}'.format(_('with SWIPE notes'))
                if difficulties is not u' ':
                    extra_fields.append((difficulty, {
                    'verbose_name': d_verbose,
                    'type': 'html',
                    'value': difficulties,
                    }))
                exclude_fields.append(difficulty)
                exclude_fields.append(difficultynote)
                exclude_fields.append(difficultystar)

            exclude_fields.append('title')
            exclude_fields.append('romaji')
            exclude_fields.append('cover')
            exclude_fields.append('i_attribute')
            exclude_fields.append('i_unit')
            exclude_fields.append('i_subunit')
            exclude_fields.append('c_locations')
            exclude_fields.append('b_side_master')
            exclude_fields.append('master_swipe')
            
            order = ['itunes_id', 'length', 'bpm', 'c_versions', 'availability', 'unlock',
                     'daily', 'countdown', 'b_side_start', 'b_side_end', 'easy', 'normal', 'hard', 'expert',
                     'master', 'songwriters', 'release'] + order

            fields = super(SongCollection.ItemView, self).to_fields(
                item, *args, order=order, extra_fields=extra_fields, exclude_fields=exclude_fields, **kwargs)

            if item.romaji and item.romaji != item.title:
                setSubField(fields, 'title', key='type', value='title_text')
                setSubField(fields, 'title', key='title', value=item.title)
                setSubField(fields, 'title', key='value', value=item.romaji)

            setSubField(fields, 'unlock', key='type', value='text')
            setSubField(fields, 'unlock', key='value', value=u'Rank {}'.format(item.unlock))

            setSubField(fields, 'easy', key='image', value=staticImageURL('easy', folder='difficulty', extension='png'))
            setSubField(fields, 'normal', key='image', value=staticImageURL('normal', folder='difficulty', extension='png'))
            setSubField(fields, 'hard', key='image', value=staticImageURL('hard', folder='difficulty', extension='png'))
            setSubField(fields, 'expert', key='image', value=staticImageURL('expert', folder='difficulty', extension='png'))
            setSubField(fields, 'master', key='image', value=staticImageURL('master', folder='difficulty', extension='png'))

            return fields
        
    def _modification_extra_context(self, context):
        if 'js_variables' not in context:
            context['js_variables'] = {}
        context['js_variables']['version_prefixes'] = jsv(self._version_prefixes)
        
    class ListView(MagiCollection.ListView):
        filter_form = forms.SongFilterForm
        item_template = custom_item_template
        per_line = 4
        default_ordering = '-release'
        ajax_pagination_callback = 'loadSongs'

        def extra_context(self, context):
            super(SongCollection.ListView, self).extra_context(context)
            self.collection._modification_extra_context(context)

    class AddView(MagiCollection.AddView):
        staff_required = True
        permissions_required = ['manage_main_items']
        ajax_callback = 'loadSongs'

        def extra_context(self, context):
            super(SongCollection.AddView, self).extra_context(context)
            self.collection._modification_extra_context(context)

    class EditView(MagiCollection.EditView):
        staff_required = True
        permissions_required = ['manage_main_items']
        ajax_callback = 'loadSongs'
        allow_delete = True

        def extra_context(self, context):
            super(SongCollection.EditView, self).extra_context(context)
            self.collection._modification_extra_context(context)
コード例 #32
0
}

IDOL_ORDER = [
    'image', 'name', 'japanese_name', 'attribute', 'unit', 'subunit', 'school',
    'year', 'astrological_sign', 'birthday', 'age', 'blood', 'measurements', 'color',
    'hobbies', 'favorite_food', 'least_favorite_food', 'description',
]

IDOLS_CUTEFORM = {
    'i_unit': {
    },
    'i_subunit': {
    },
    'sub_unit': {
        'to_cuteform': lambda k, v: (
            staticImageURL(k, folder='i_unit', extension='png') if float(k) - 2 < 0 else
            staticImageURL(int(k) - 2, folder='i_subunit', extension='png')
            ),
        'title': _('Unit'),
        'extra_settings': {
            'modal': 'true',
            'modal-text': 'true',
        },
    },
    'i_attribute': {
    },
    'i_year': {
        'type': CuteFormType.HTML,
    },
    'i_astrological_sign': {
    },