Пример #1
0
def settings(request, context):
    magi_settings(request, context)
    cuteFormFieldsForContext({
        'd_extra-i_favorite_band': {
            'image_folder': 'band',
            'to_cuteform': 'value',
            'title': _('Band'),
            'extra_settings': {
                'modal': 'true',
                'modal-text': 'true',
            },
        },
    }, context, context['forms']['preferences'])
Пример #2
0
def teambuilder(request):
    context = getGlobalContext(request)

    redirectWhenNotAuthenticated(request, context, next_title=_('Team builder'))
    context['page_title'] = _('Team builder')
    context['side_bar_no_padding'] = True
    context['learn_more_sentence'] = _('Learn more')
    context['no_container'] = True
    context['js_files'] = ['teambuilder']

    if len(request.GET) > 0:
        form = TeamBuilderForm(request.GET, request=request)
        if form.is_valid():
            skill_type_main_value = SKILL_TYPE_TO_MAIN_VALUE.get(form.cleaned_data.get('i_skill_type', ''), '').format(
                perfect_accuracy=form.cleaned_data.get('perfect_accuracy', 0.8),
                stamina_accuracy=form.cleaned_data.get('stamina_accuracy', 0.8),
            )
            extra_select = {
                'overall_stats': u'CASE trained WHEN 1 THEN performance_trained_max + technique_trained_max + visual_trained_max ELSE performance_max + technique_max + visual_max END',
            }
            order_by = []
            if form.cleaned_data['i_band']:
                extra_select['is_correct_band'] = u'i_band = {}'.format(form.cleaned_data['i_band'])
                order_by.append('-is_correct_band')
            if form.cleaned_data['i_attribute']:
                extra_select['is_correct_attribute'] = u'i_attribute = {}'.format(form.cleaned_data['i_attribute'])
                order_by.append('-is_correct_attribute')
            if form.cleaned_data['i_skill_type']:
                extra_select['is_correct_skill'] = u'i_skill_type = {}'.format(form.cleaned_data['i_skill_type'])
                extra_select['skill_real_duration'] = u'skill_duration + ((IFNULL(skill_level, 1) - 1) * 0.5)'
                extra_select['skill_main_value'] = skill_type_main_value
                extra_select['skill_significant_value'] = u'({}) * ({})'.format(extra_select['skill_real_duration'], extra_select['skill_main_value'])
                order_by += ['-skill_significant_value', '-is_correct_skill']
            order_by += ['-overall_stats']
            queryset = form.Meta.model.objects.extra(select=extra_select).order_by(*order_by).select_related('card', 'card__member')
            queryset = form.filter_queryset(queryset, request.GET, request)

            # Only allow one of each member per team
            added_members = []
            team = []
            for cc in queryset:
                if request.user.is_staff:
                    cc.calculation_details = [
                        unicode(cc.card),
                        mark_safe(u'Ordering: <ol>{}</ol>'.format(''.join([
                            u'<li>{}</li>'.format(o.replace('-', '').replace('_', ' ').capitalize())
                            for o in order_by
                        ]))),
                    ]
                    if form.cleaned_data['i_skill_type']:
                        cc.calculation_details += [
                            u'Skill type: {}'.format(unicode(cc.card.t_skill_type)),
                            'Skill: {}'.format(cc.card.full_skill),
                            'Base skill duration: {}'.format(cc.card.skill_duration),
                            'Skill level: {}'.format(cc.skill_level or 1),
                            mark_safe(u'Real skill duration: {}<br><small class="text-muted">skill_duration + (skill_level - 1) * 0.5)</small>'.format(cc.skill_real_duration)),
                            mark_safe(u'Main value of skill: {}<br><small class="text-muted">{}</small>'.format(
                                cc.skill_main_value,
                                skill_type_main_value,
                            )),
                            mark_safe(u'Skill significant value: {}<br><small class="text-muted">real_skill_duration * main_value</small>'.format(cc.skill_significant_value),),
                        ]
                if cc.card.member_id in added_members:
                    continue
                team.append(cc)
                added_members.append(cc.card.member_id)
                if len(team) == int(form.cleaned_data.get('total_cards', 5) or 5):
                    break

            context['team'] = team
        else:
            context['hide_side_bar'] = True
    else:
        form = TeamBuilderForm(request=request)
        context['hide_side_bar'] = True

    cuteFormFieldsForContext({
        'i_band': {
            'image_folder': 'band',
            'to_cuteform': 'value',
            'extra_settings': {
                'modal': 'true',
                'modal-text': 'true',
            },
        },
        'i_attribute': {},
        'i_skill_type': {
            'to_cuteform': lambda k, v: CardCollection._skill_icons[k],
            'transform': CuteFormTransform.Flaticon,
        },
        'total_cards': {
            'type': CuteFormType.HTML,
        },
    }, context, form=form, prefix='#teambuilder-form ')

    context['filter_form'] = form
    return render(request, 'pages/teambuilder.html', context)
Пример #3
0
def edit_view(request,
              name,
              collection,
              pk,
              extra_filters={},
              ajax=False,
              shortcut_url=None,
              **kwargs):
    context = collection.edit_view.get_global_context(request)
    context['is_translate'] = 'translate' in request.GET
    if context['is_translate']:
        collection.edit_view.check_translate_permissions(request, context)
    else:
        collection.edit_view.check_permissions(request, context)
    context['is_reported'] = 'is_reported' in request.GET
    context = _modification_view(context, name, collection.edit_view, ajax)
    queryset = collection.edit_view.get_queryset(
        collection.queryset, _get_filters(request.GET, extra_filters), request)
    instance = get_one_object_or_404(
        queryset, **collection.edit_view.get_item(request, pk))
    context['type'] = None
    collection.edit_view.check_owner_permissions(request, context, instance)
    if context['is_translate']:
        formClass = collection.edit_view.translate_form_class
        context['icontitle'] = 'translate'
    elif collection.types:
        type = instance.type
        context['type'] = type
        collection.edit_view.check_type_permissions(request,
                                                    context,
                                                    type=type,
                                                    item=instance)
        formClass = collection.types[type].get('form_class',
                                               collection.edit_view.form_class)
        context['imagetitle'] = collection.types[type].get(
            'image', collection.image)
        context['icontitle'] = collection.types[type].get(
            'icon', collection.icon)
    else:
        formClass = collection.edit_view.form_class
        context['imagetitle'] = collection.image
        context['icontitle'] = collection.icon
    if str(_type(formClass)) == '<type \'instancemethod\'>':
        formClass = formClass(request, context)
    allowDelete = not context[
        'is_translate'] and collection.edit_view.allow_delete and 'disable_delete' not in request.GET
    form = formClass(instance=instance,
                     request=request,
                     ajax=ajax,
                     collection=collection)
    if allowDelete:
        formDelete = ConfirmDelete(initial={
            'thing_to_delete': instance.pk,
        },
                                   request=request,
                                   instance=instance,
                                   collection=collection)
    form = formClass(instance=instance,
                     request=request,
                     ajax=ajax,
                     collection=collection)
    if allowDelete and request.method == 'POST' and u'delete_{}'.format(
            collection.name) in request.POST:
        formDelete = ConfirmDelete(request.POST,
                                   request=request,
                                   instance=instance,
                                   collection=collection)
        if formDelete.is_valid():
            collection.edit_view.before_delete(request, instance, ajax)
            redirectURL = collection.edit_view.redirect_after_delete(
                request, instance, ajax)
            instance.delete()
            raise HttpRedirectException(redirectURL)
    elif request.method == 'POST':
        form = formClass(request.POST,
                         request.FILES,
                         instance=instance,
                         request=request,
                         ajax=ajax,
                         collection=collection)
        if form.is_valid():
            instance = form.save(commit=False)
            instance = collection.edit_view.before_save(request, instance)
            instance.save()
            if collection.edit_view.savem2m and not context['is_translate']:
                form.save_m2m()
            instance = collection.edit_view.after_save(request, instance)
            redirectURL = collection.edit_view.redirect_after_edit(
                request, instance, ajax)
            raise HttpRedirectException(redirectURL)
    cuteFormFieldsForContext(
        collection.edit_view.filter_cuteform,
        context,
        form=form,
        prefix=u'[data-form-name="edit_{}"] '.format(collection.name),
        ajax=ajax,
    )
    if shortcut_url is not None:
        context['shortcut_url'] = shortcut_url
    context['forms'] = OrderedDict()
    context[
        'action_sentence'] = instance.edit_sentence  # Used as the page title
    form.action_sentence = instance.edit_sentence
    context['item'] = instance
    context['item'].request = request
    context['share_image'] = _get_share_image(context,
                                              collection.edit_view,
                                              item=context['item'])
    _modification_views_page_titles(instance.edit_sentence, context,
                                    unicode(instance))
    context['ajax_callback'] = collection.edit_view.ajax_callback
    context['forms'][u'edit_{}'.format(collection.name)] = form
    context['collection'] = collection
    if allowDelete:
        formDelete.alert_message = _(
            'You can\'t cancel this action afterwards.')
        formDelete.action_sentence = instance.delete_sentence
        formDelete.form_title = u'{}: {}'.format(instance.delete_sentence,
                                                 unicode(instance))
        if 'js_variables' not in context or not context['js_variables']:
            context['js_variables'] = OrderedDict()
        context['js_variables']['show_cascade_before_delete'] = jsv(
            collection.edit_view.show_cascade_before_delete)
        context['forms'][u'delete_{}'.format(collection.name)] = formDelete

    collection.edit_view.extra_context(context)
    if ajax:
        context['include_template'] = 'collections/modification_view'
        context['extends'] = 'ajax.html'
        context['ajax'] = True
    return render(request, 'collections/modification_view.html', context)
Пример #4
0
def add_view(request,
             name,
             collection,
             type=None,
             ajax=False,
             shortcut_url=None,
             **kwargs):
    context = collection.add_view.get_global_context(request)
    collection.add_view.check_permissions(request, context)
    context = _modification_view(context, name, collection.add_view, ajax)
    with_types = False
    if shortcut_url is not None:
        context['shortcut_url'] = shortcut_url
    context['next'] = request.GET.get('next', None)
    context['next_title'] = request.GET.get('next_title', None)
    context['type'] = None
    after_title = None
    if type is not None and collection.types:
        if type not in collection.types:
            raise Http404
        with_types = True
        context['type'] = type
        collection.add_view.check_type_permissions(request, context, type=type)
        formClass = collection.types[type].get('form_class',
                                               collection.add_view.form_class)
        context['imagetitle'] = collection.types[type].get(
            'image', collection.image)
        context['icontitle'] = collection.types[type].get(
            'icon', collection.icon)
        after_title = collection.types[type].get('title', type)
    else:
        formClass = collection.add_view.form_class
        context['imagetitle'] = collection.image
        context['icontitle'] = collection.icon
    if str(_type(formClass)) == '<type \'instancemethod\'>':
        formClass = formClass(request, context)
    if request.method == 'GET':
        form = formClass(
            request=request, ajax=ajax,
            collection=collection) if not with_types else formClass(
                request=request, ajax=ajax, collection=collection, type=type)
    elif request.method == 'POST':
        form = formClass(
            request.POST,
            request.FILES,
            request=request,
            ajax=ajax,
            collection=collection) if not with_types else formClass(
                request.POST,
                request.FILES,
                request=request,
                ajax=ajax,
                collection=collection,
                type=type)
        if form.is_valid():
            instance = form.save(commit=False)
            instance = collection.add_view.before_save(request,
                                                       instance,
                                                       type=type)
            instance.save()
            if collection.add_view.savem2m:
                form.save_m2m()
            instance = collection.add_view.after_save(request,
                                                      instance,
                                                      type=type)
            if collection.add_view.allow_next and context['next']:
                raise HttpRedirectException(context['next'])
            redirectURL = collection.add_view.redirect_after_add(
                request, instance, ajax)
            if context['next']:
                redirectURL += '{}next={}&next_title={}'.format(
                    '&' if '?' in redirectURL else '?',
                    context['next'],
                    context['next_title'] if context['next_title'] else '',
                )
            raise HttpRedirectException(redirectURL)
    cuteFormFieldsForContext(
        collection.add_view.filter_cuteform,
        context,
        form=form,
        prefix=u'[data-form-name="add_{}"] '.format(collection.name),
        ajax=ajax,
    )
    _modification_views_page_titles(collection.add_sentence, context,
                                    after_title)
    context['action_sentence'] = collection.add_sentence  # Used in page title
    form.action_sentence = collection.add_sentence  # Genericity when we have multiple forms
    context['share_image'] = _get_share_image(context, collection.add_view)
    context['forms'] = {u'add_{}'.format(collection.name): form}
    context['ajax_callback'] = collection.add_view.ajax_callback
    context['collection'] = collection
    if collection.add_view.alert_duplicate:
        context['alert_message'] = _(
            'Make sure the {thing} you\'re about to add doesn\'t already exist.'
        ).format(thing=_(collection.title.lower()))
        context['alert_button_link'] = context['list_url']
        context['alert_button_string'] = _(collection.plural_title)

    collection.add_view.extra_context(context)
    if ajax:
        context['include_template'] = 'collections/modification_view'
        context['extends'] = 'ajax.html'
        context['ajax'] = True
    return render(request, 'collections/modification_view.html', context)
Пример #5
0
def list_view(request,
              name,
              collection,
              ajax=False,
              extra_filters={},
              shortcut_url=None,
              **kwargs):
    """
    View function for any page that lists data, such as cards. Handles pagination and context variables.
    name: The string that corresponds to the view (for instance 'cards' for the '/cards/' view)
    """
    context = collection.list_view.get_global_context(request)
    collection.list_view.check_permissions(request, context)
    context['plural_name'] = collection.plural_name
    page = 0
    page_size = collection.list_view.page_size
    if 'page_size' in request.GET:
        try:
            page_size = int(request.GET['page_size'])
        except ValueError:
            pass
        if page_size > 500: page_size = 500
    filters = _get_filters(request.GET, extra_filters)
    queryset = collection.list_view.get_queryset(collection.queryset, filters,
                                                 request)

    ordering = None
    if 'ordering' in request.GET and request.GET['ordering']:
        reverse = ('reverse_order' in request.GET
                   and request.GET['reverse_order']) or not request.GET or len(
                       request.GET) == 1
        prefix = '-' if reverse else ''
        ordering = [
            prefix + ordering
            for ordering in request.GET['ordering'].split(',')
        ]
        if (collection.list_view.show_relevant_fields_on_ordering
                and request.GET['ordering'] != ','.join(
                    collection.list_view.plain_default_ordering_list)):
            context['show_relevant_fields_on_ordering'] = True
            context['plain_ordering'] = [
                o[1:] if o.startswith('-') else o for o in ordering
            ]

    if collection.list_view.filter_form:
        if len(request.GET) > 1 or (len(request.GET) == 1
                                    and 'page' not in request.GET):
            context['filter_form'] = collection.list_view.filter_form(
                filters, request=request, ajax=ajax, collection=collection)
        else:
            context['filter_form'] = collection.list_view.filter_form(
                request=request, ajax=ajax, collection=collection)
        if hasattr(context['filter_form'], 'filter_queryset'):
            queryset = context['filter_form'].filter_queryset(
                queryset, filters, request)
        else:
            queryset = filter_ids(queryset, request)
    else:
        queryset = filter_ids(queryset, request)

    if not ordering:
        if ('filter_form' in context
                and 'ordering' in context['filter_form'].fields
                and context['filter_form'].fields['ordering'].initial):
            reverse = True
            if 'reverse_order' in context['filter_form'].fields:
                reverse = context['filter_form'].fields[
                    'reverse_order'].initial
            ordering = [
                u'{}{}'.format(
                    '-' if reverse else '',
                    context['filter_form'].fields['ordering'].initial,
                )
            ]
        else:
            ordering = collection.list_view.default_ordering.split(',')
    queryset = queryset.order_by(*ordering)

    if collection.list_view.distinct:
        queryset = queryset.distinct()
    context['total_results'] = queryset.count()
    context['total_results_sentence'] = _(
        '1 {object} matches your search:').format(
            object=collection.title.lower(
            )) if context['total_results'] == 1 else _(
                '{total} {objects} match your search:').format(
                    total=context['total_results'],
                    objects=collection.plural_title.lower())

    if 'page' in request.GET and request.GET['page']:
        page = int(request.GET['page']) - 1
        if page < 0:
            page = 0
    queryset = queryset[(page * page_size):((page * page_size) + page_size)]

    if 'filter_form' in context and not ajax:
        cuteFormFieldsForContext(
            collection.list_view.filter_cuteform,
            context,
            form=context['filter_form'],
            prefix='#sidebar-wrapper ',
            ajax=ajax,
        )

    # Will display a link to see the other results instead of the pagination button
    context['ajax_modal_only'] = False
    if 'ajax_modal_only' in request.GET:
        context['ajax_modal_only'] = True
        context['filters_string'] = '&'.join([
            '{}={}'.format(k, v) for k, v in filters.items()
            if k != 'ajax_modal_only'
        ])
        context['remaining'] = context['total_results'] - page_size

    # Will still show top buttons at the top, first page only
    context[
        'ajax_show_top_buttons'] = ajax and 'ajax_show_top_buttons' in request.GET and page == 0

    if shortcut_url is not None:
        context['shortcut_url'] = shortcut_url

    # Ajax items reloader
    if not ajax and collection.list_view.auto_reloader and collection.list_view.ajax:
        context['ajax_reload_url'] = collection.get_list_url(ajax=True)
        context['reload_urls_start_with'] = [
            u'/{}/edit/'.format(collection.plural_name)
        ]
        if collection.collectible_collections:
            context['reload_urls_start_with'] += [
                cc.get_add_url()
                for cc in collection.collectible_collections.values()
            ]

    # Alt views
    context['view'] = None
    context['alt_view'] = None
    alt_views = dict(collection.list_view.alt_views)
    if 'view' in request.GET and request.GET['view'] in alt_views:
        context['view'] = request.GET['view']
        context['alt_view'] = alt_views[context['view']]
    context['ordering'] = ordering
    context['page_title'] = _(u'{things} list').format(
        things=collection.plural_title)
    context['h1_page_title'] = collection.plural_title
    context['total_pages'] = int(
        math.ceil(context['total_results'] / page_size))
    context['items'] = queryset
    context['page'] = page + 1

    page_buttons = [(0, 'active' if page == 0 else None)]
    if page > 2:
        page_buttons.append((-1, 'disabled'))
    if (page - 1) > 0:
        page_buttons.append((page - 1, None))
    page_buttons.append((page, 'active'))
    if (page + 1) < (context['total_pages'] - 1):
        page_buttons.append((page + 1, None))
    if page < (context['total_pages'] - 3):
        page_buttons.append((-2, 'disabled'))
    page_buttons.append(
        (context['total_pages'] - 1,
         'active' if page == (context['total_pages'] - 1) else None))
    context['displayed_page_buttons'] = listUnique(page_buttons)
    if request.path and request.path != '/':
        context['next_page_url'] = u'/ajax{}'.format(request.path)
    else:
        context['next_page_url'] = u'/ajax/{}/'.format(collection.plural_name)
    context['is_last_page'] = context['page'] == context['total_pages']
    context['page_size'] = page_size
    context['show_no_result'] = not ajax or context['ajax_modal_only']
    context[
        'show_search_results'] = collection.list_view.show_search_results and bool(
            request.GET)
    context['show_owner'] = 'show_owner' in request.GET
    context['get_started'] = 'get_started' in request.GET
    context['name'] = name
    context['title'] = collection.title
    context['reportable'] = collection.reportable
    context['hide_sidebar'] = collection.list_view.hide_sidebar
    context['before_template'] = collection.list_view.before_template
    context['no_result_template'] = collection.list_view.no_result_template
    context['after_template'] = collection.list_view.after_template
    context['item_template'] = collection.list_view.item_template
    context['hide_icons'] = collection.list_view.hide_icons
    context[
        'item_blocked_template'] = collection.list_view.item_blocked_template
    if context['alt_view'] and 'template' in context['alt_view']:
        context['item_template'] = context['alt_view']['template']
    context['item_padding'] = collection.list_view.item_padding
    context['show_title'] = collection.list_view.show_title
    context['plural_title'] = collection.plural_title
    context['show_items_names'] = collection.list_view.show_items_names
    context['show_items_titles'] = collection.list_view.show_items_titles
    context['lowercase_plural_title'] = collection.plural_title.lower()
    context['ajax_pagination'] = collection.list_view.ajax
    context[
        'ajax_pagination_callback'] = collection.list_view.ajax_pagination_callback
    if not ajax or context['ajax_modal_only']:
        # Should only be called once
        context['ajax_callback'] = collection.list_view.ajax_callback
    context['ajax'] = ajax
    context['js_files'] = collection.list_view.js_files
    context['share_image'] = _get_share_image(context, collection.list_view)
    context['full_width'] = collection.list_view.full_width
    if context['alt_view'] and 'full_width' in context['alt_view']:
        context['full_width'] = context['alt_view']['full_width']
    context['display_style'] = collection.list_view.display_style
    if context['alt_view'] and 'display_style' in context['alt_view']:
        context['display_style'] = context['alt_view']['display_style']
    context[
        'display_style_table_classes'] = collection.list_view.display_style_table_classes
    context[
        'display_style_table_fields'] = collection.list_view.display_style_table_fields
    if context['alt_view'] and 'display_style_table_fields' in context[
            'alt_view']:
        context['display_style_table_fields'] = context['alt_view'][
            'display_style_table_fields']
    context['col_break'] = collection.list_view.col_break
    context['per_line'] = int(
        request.GET['max_per_line']) if 'max_per_line' in request.GET and int(
            request.GET['max_per_line']
        ) < collection.list_view.per_line else collection.list_view.per_line
    if context['alt_view'] and 'per_line' in context['alt_view']:
        context['per_line'] = context['alt_view']['per_line']
    context['col_size'] = _get_col_size(context['per_line'])
    context['ajax_item_popover'] = collection.list_view.ajax_item_popover
    context['item_view_enabled'] = collection.item_view.enabled
    context['ajax_item_view_enabled'] = context[
        'item_view_enabled'] and collection.item_view.ajax and not context[
            'ajax_item_popover']
    context['include_below_item'] = False  # May be set to true below
    context['collection'] = collection

    if context['display_style'] == 'table':
        context[
            'table_fields_headers'] = collection.list_view.table_fields_headers(
                context['display_style_table_fields'], view=context['view'])
        context[
            'table_fields_headers_sections'] = collection.list_view.table_fields_headers_sections(
                view=context['view'])

    if not ajax or context['ajax_show_top_buttons']:
        context['top_buttons'] = collection.list_view.top_buttons(
            request, context)
        context['top_buttons_total'] = len([
            True for b in context['top_buttons'].values()
            if b['show'] and b['has_permissions']
        ])
        if context['top_buttons_total']:
            context['top_buttons_col_size'] = _get_col_size(
                context['top_buttons_total'])

    context['show_item_buttons'] = collection.list_view.show_item_buttons
    for i, item in enumerate(queryset):
        item.request = request
        if collection.list_view.foreach_items:
            collection.list_view.foreach_items(i, item, context)
        if context.get('show_relevant_fields_on_ordering', False):
            context['include_below_item'] = True
            item.relevant_fields_to_show = collection.list_view.ordering_fields(
                item, only_fields=context['plain_ordering'], request=request)
        if context['display_style'] == 'table':
            item.table_fields = collection.list_view.table_fields(
                item,
                only_fields=context['display_style_table_fields'],
                force_all_fields=True,
                request=request)
        item.buttons_to_show = collection.list_view.buttons_per_item(
            request, context, item)
        if 'only_show_buttons' in request.GET:
            only_show_buttons = request.GET['only_show_buttons'].split(',')
            for button_name, button in item.buttons_to_show.items():
                if button_name not in only_show_buttons:
                    button['show'] = False
        item.show_item_buttons_justified = collection.list_view.show_item_buttons_justified
        item.show_item_buttons_as_icons = collection.list_view.show_item_buttons_as_icons
        item.show_item_buttons_in_one_line = collection.list_view.show_item_buttons_in_one_line
        if collection.list_view.show_item_buttons and [
                True for b in item.buttons_to_show.values()
                if b['show'] and b['has_permissions']
        ]:
            context['include_below_item'] = True
        if request.user.is_authenticated() and collection.blockable:
            if item.owner_id in request.user.preferences.cached_blocked_ids:
                item.blocked = True
                try:
                    username = item.owner.username
                except AttributeError:
                    username = _('this user')
                item.blocked_message = _(u'You blocked {username}.').format(
                    username=username)
                item.unblock_button = _(u'Unblock {username}').format(
                    username=username)
            elif item.owner_id in request.user.preferences.cached_blocked_by_ids:
                item.blocked_by_owner = True

    collection.list_view.extra_context(context)

    if ajax:
        context['include_template'] = 'collections/list_page'
        if context['ajax_modal_only'] and context['ajax_pagination_callback']:
            context['ajax_callback'] = context['ajax_pagination_callback']
        return render(request, 'ajax.html', context)
    return render(request, 'collections/list_view.html', context)
def edit_view(request, name, collection, pk, extra_filters={}, ajax=False, shortcut_url=None, **kwargs):
    context = collection.edit_view.get_global_context(request)
    context['is_translate'] = 'translate' in request.GET
    if context['is_translate']:
        collection.edit_view.check_translate_permissions(request, context)
    else:
        collection.edit_view.check_permissions(request, context)
    context['is_reported'] = 'is_reported' in request.GET
    context = _modification_view(context, name, collection.edit_view, ajax)
    queryset = collection.edit_view.get_queryset(collection.queryset, _get_filters(request.GET, extra_filters), request)
    instance = get_one_object_or_404(queryset, **collection.edit_view.get_item(request, pk))
    context['type'] = None
    collection.edit_view.check_owner_permissions(request, context, instance)
    if context['is_translate']:
        formClass = collection.edit_view.translate_form_class
        context['icontitle'] = 'translate'
    elif collection.types:
        type = instance.type
        context['type'] = type
        collection.edit_view.check_type_permissions(request, context, type=type, item=instance)
        formClass = collection.types[type].get('form_class', collection.edit_view.form_class)
        context['imagetitle'] = collection.types[type].get('image', collection.image)
        context['icontitle'] = collection.types[type].get('icon', collection.icon)
    else:
        formClass = collection.edit_view.form_class
        context['imagetitle'] = collection.image
        context['icontitle'] = collection.icon
    if str(_type(formClass)) == '<type \'instancemethod\'>':
        formClass = formClass(request, context)
    allowDelete = collection.edit_view.allow_delete
    if str(_type(allowDelete)) == '<type \'instancemethod\'>':
        allowDelete = allowDelete(instance, request, context)
    allowDelete = not context['is_translate'] and allowDelete and 'disable_delete' not in request.GET
    form = formClass(instance=instance, request=request, ajax=ajax, collection=collection)
    if allowDelete:
        formDelete = ConfirmDelete(initial={
            'thing_to_delete': instance.pk,
        }, request=request, instance=instance, collection=collection)
    form = formClass(instance=instance, request=request, ajax=ajax, collection=collection)
    if allowDelete and request.method == 'POST' and u'delete_{}'.format(collection.name) in request.POST:
        formDelete = ConfirmDelete(request.POST, request=request, instance=instance, collection=collection)
        if formDelete.is_valid():
            collection.edit_view.before_delete(request, instance, ajax)
            redirectURL = collection.edit_view.redirect_after_delete(request, instance, ajax)
            instance.delete()
            raise HttpRedirectException(redirectURL)
    elif request.method == 'POST':
        form = formClass(request.POST, request.FILES, instance=instance, request=request, ajax=ajax, collection=collection)
        if form.is_valid():
            instance = form.save(commit=False)
            instance = collection.edit_view.before_save(request, instance)
            instance.save()
            if collection.edit_view.savem2m and not context['is_translate']:
                form.save_m2m()
            instance = collection.edit_view.after_save(request, instance)
            redirectURL = collection.edit_view.redirect_after_edit(request, instance, ajax)
            raise HttpRedirectException(redirectURL)
    cuteFormFieldsForContext(
        collection.edit_view.filter_cuteform,
        context, form=form,
        prefix=u'[data-form-name="edit_{}"] '.format(collection.name),
        ajax=ajax,
    )
    if shortcut_url is not None:
        context['shortcut_url'] = shortcut_url
    context['forms'] = OrderedDict()
    context['action_sentence'] = instance.edit_sentence # Used as the page title
    form.action_sentence = instance.edit_sentence
    context['item'] = instance
    context['item'].request = request
    context['share_image'] = _get_share_image(context, collection.edit_view, item=context['item'])
    _modification_views_page_titles(instance.edit_sentence, context, unicode(instance))
    context['ajax_callback'] = collection.edit_view.ajax_callback
    context['forms'][u'edit_{}'.format(collection.name)] = form
    context['collection'] = collection
    if allowDelete:
        formDelete.alert_message = _('You can\'t cancel this action afterwards.')
        formDelete.action_sentence = instance.delete_sentence
        formDelete.form_title = u'{}: {}'.format(instance.delete_sentence, unicode(instance))
        if 'js_variables' not in context or not context['js_variables']:
            context['js_variables'] = OrderedDict()
        context['js_variables']['show_cascade_before_delete'] = jsv(collection.edit_view.show_cascade_before_delete)
        context['forms'][u'delete_{}'.format(collection.name)] = formDelete

    collection.edit_view.extra_context(context)
    if ajax:
        context['include_template'] = 'collections/modification_view'
        context['extends'] = 'ajax.html'
        context['ajax'] = True
    return render(request, 'collections/modification_view.html', context)
def add_view(request, name, collection, type=None, ajax=False, shortcut_url=None, **kwargs):
    context = collection.add_view.get_global_context(request)
    collection.add_view.check_permissions(request, context)
    context = _modification_view(context, name, collection.add_view, ajax)
    with_types = False
    if shortcut_url is not None:
        context['shortcut_url'] = shortcut_url
    context['next'] = request.GET.get('next', None)
    context['next_title'] = request.GET.get('next_title', None)
    context['type'] = None
    after_title = None
    if type is not None and collection.types:
        if type not in collection.types:
            raise Http404
        with_types = True
        context['type'] = type
        collection.add_view.check_type_permissions(request, context, type=type)
        formClass = collection.types[type].get('form_class', collection.add_view.form_class)
        context['imagetitle'] = collection.types[type].get('image', collection.image)
        context['icontitle'] = collection.types[type].get('icon', collection.icon)
        after_title = collection.types[type].get('title', type)
    else:
        formClass = collection.add_view.form_class
        context['imagetitle'] = collection.image
        context['icontitle'] = collection.icon
    if str(_type(formClass)) == '<type \'instancemethod\'>':
        formClass = formClass(request, context)
    if request.method == 'GET':
        form = formClass(request=request, ajax=ajax, collection=collection) if not with_types else formClass(request=request, ajax=ajax, collection=collection, type=type)
    elif request.method == 'POST':
        form = formClass(request.POST, request.FILES, request=request, ajax=ajax, collection=collection) if not with_types else formClass(request.POST, request.FILES, request=request, ajax=ajax, collection=collection, type=type)
        if form.is_valid():
            instance = form.save(commit=False)
            instance = collection.add_view.before_save(request, instance, type=type)
            instance.save()
            if collection.add_view.savem2m:
                form.save_m2m()
            instance = collection.add_view.after_save(request, instance, type=type)
            if collection.add_view.allow_next and context['next']:
                raise HttpRedirectException(context['next'])
            redirectURL = collection.add_view.redirect_after_add(request, instance, ajax)
            if context['next']:
                redirectURL += '{}next={}&next_title={}'.format(
                    '&' if '?' in redirectURL else '?',
                    context['next'],
                    context['next_title'] if context['next_title'] else '',
                )
            raise HttpRedirectException(redirectURL)
    cuteFormFieldsForContext(
        collection.add_view.filter_cuteform,
        context, form=form,
        prefix=u'[data-form-name="add_{}"] '.format(collection.name),
        ajax=ajax,
    )
    _modification_views_page_titles(collection.add_sentence, context, after_title)
    context['action_sentence'] = collection.add_sentence # Used in page title
    form.action_sentence = collection.add_sentence # Genericity when we have multiple forms
    context['share_image'] = _get_share_image(context, collection.add_view)
    context['forms'] = { u'add_{}'.format(collection.name): form }
    context['ajax_callback'] = collection.add_view.ajax_callback
    context['collection'] = collection
    if collection.add_view.alert_duplicate:
        context['alert_message'] = _('Make sure the {thing} you\'re about to add doesn\'t already exist.').format(thing=_(collection.title.lower()))
        context['alert_button_link'] = context['list_url']
        context['alert_button_string'] = _(collection.plural_title)

    collection.add_view.extra_context(context)
    if ajax:
        context['include_template'] = 'collections/modification_view'
        context['extends'] = 'ajax.html'
        context['ajax'] = True
    return render(request, 'collections/modification_view.html', context)
def list_view(request, name, collection, ajax=False, extra_filters={}, shortcut_url=None, **kwargs):
    """
    View function for any page that lists data, such as cards. Handles pagination and context variables.
    name: The string that corresponds to the view (for instance 'cards' for the '/cards/' view)
    """
    context = collection.list_view.get_global_context(request)
    collection.list_view.check_permissions(request, context)
    context['plural_name'] = collection.plural_name
    page = 0

    # Alt views
    context['view'] = None
    context['alt_view'] = None
    alt_views = dict(collection.list_view.alt_views)
    page_size = collection.list_view.page_size
    if 'view' in request.GET and request.GET['view'] in alt_views:
        context['view'] = request.GET['view']
        context['alt_view'] = alt_views[context['view']]
    if context['alt_view'] and 'page_size' in context['alt_view']:
        page_size = context['alt_view']['page_size']

    if 'page_size' in request.GET:
        try: page_size = int(request.GET['page_size'])
        except ValueError: pass
        if page_size > 500: page_size = 500
    filters = _get_filters(request.GET, extra_filters)
    queryset = collection.list_view.get_queryset(collection.queryset, filters, request)

    show_relevant_fields_on_ordering = collection.list_view.show_relevant_fields_on_ordering
    if context['alt_view'] and 'show_relevant_fields_on_ordering' in context['alt_view']:
        show_relevant_fields_on_ordering = context['alt_view']['show_relevant_fields_on_ordering']

    ordering = None
    if 'ordering' in request.GET and request.GET['ordering']:
        reverse = ('reverse_order' in request.GET and request.GET['reverse_order']) or not request.GET or len(request.GET) == 1
        prefix = '-' if reverse else ''
        ordering = [prefix + ordering for ordering in request.GET['ordering'].split(',')]
        if (show_relevant_fields_on_ordering
            and request.GET['ordering'] != ','.join(collection.list_view.plain_default_ordering_list)):
            context['show_relevant_fields_on_ordering'] = True
            context['plain_ordering'] = [o[1:] if o.startswith('-') else o for o in ordering]

    filled_filter_form = False
    if collection.list_view.filter_form:
        if len([k for k in request.GET.keys() if k not in GET_PARAMETERS_NOT_FROM_FORM]) > 0:
            context['filter_form'] = collection.list_view.filter_form(filters, request=request, ajax=ajax, collection=collection)
            filled_filter_form = True
        else:
            context['filter_form'] = collection.list_view.filter_form(request=request, ajax=ajax, collection=collection)
        if hasattr(context['filter_form'], 'filter_queryset'):
            queryset = context['filter_form'].filter_queryset(queryset, filters, request)
        else:
            queryset = filter_ids(queryset, request)
    else:
        queryset = filter_ids(queryset, request)

    if not ordering:
        if ('filter_form' in context
            and 'ordering' in context['filter_form'].fields
            and context['filter_form'].fields['ordering'].initial):
            reverse = True
            if 'reverse_order' in context['filter_form'].fields:
                reverse = context['filter_form'].fields['reverse_order'].initial
            ordering = [
                u'{}{}'.format(
                    '-' if reverse else '',
                    ordering_field,
                ) for ordering_field in context['filter_form'].fields['ordering'].initial.split(',')
            ]
        else:
            ordering = collection.list_view.default_ordering.split(',')
    queryset = queryset.order_by(*ordering)

    if collection.list_view.distinct:
        queryset = queryset.distinct()
    context['total_results'] = queryset.count()
    context['total_results_sentence'] = _('1 {object} matches your search:').format(object=collection.title.lower()) if context['total_results'] == 1 else _('{total} {objects} match your search:').format(total=context['total_results'], objects=collection.plural_title.lower())

    if 'page' in request.GET and request.GET['page']:
        page = int(request.GET['page']) - 1
        if page < 0:
            page = 0
    queryset = queryset[(page * page_size):((page * page_size) + page_size)]

    if 'filter_form' in context and not ajax:
        cuteFormFieldsForContext(
            collection.list_view.filter_cuteform,
            context, form=context['filter_form'],
            prefix='#sidebar-wrapper ',
            ajax=ajax,
        )

    # Will display a link to see the other results instead of the pagination button
    context['ajax_modal_only'] = False
    if 'ajax_modal_only' in request.GET:
        context['ajax_modal_only'] = True
        context['filters_string'] = '&'.join(['{}={}'.format(k, v) for k, v in filters.items() if k != 'ajax_modal_only'])
        context['remaining'] = context['total_results'] - page_size

    # Will still show top buttons at the top, first page only
    context['ajax_show_top_buttons'] = ajax and 'ajax_show_top_buttons' in request.GET and page == 0

    if shortcut_url is not None:
        context['shortcut_url'] = shortcut_url

    context['ordering'] = ordering
    context['page_title'] = _(u'{things} list').format(things=collection.plural_title)
    context['h1_page_title'] = collection.plural_title
    context['total_pages'] = int(math.ceil(context['total_results'] / page_size))
    context['items'] = queryset
    context['page'] = page + 1

    page_buttons = [(0, 'active' if page == 0 else None)]
    if page > 2:
        page_buttons.append((-1, 'disabled'))
    if (page - 1) > 0:
        page_buttons.append((page - 1, None))
    page_buttons.append((page, 'active'))
    if (page + 1) < (context['total_pages'] - 1):
        page_buttons.append((page + 1, None))
    if page < (context['total_pages'] - 3):
        page_buttons.append((-2, 'disabled'))
    page_buttons.append((context['total_pages'] - 1, 'active' if page == (context['total_pages'] - 1) else None))
    context['displayed_page_buttons'] = listUnique(page_buttons)
    if request.path and request.path != '/':
        context['next_page_url'] = u'/ajax{}'.format(request.path)
    else:
        context['next_page_url'] = u'/ajax/{}/'.format(collection.plural_name)

    # Ajax items reloader
    if not ajax and collection.list_view.auto_reloader and collection.list_view.ajax:
        context['ajax_reload_url'] = context['next_page_url']
        context['reload_urls_start_with'] = [u'/{}/edit/'.format(collection.plural_name)];
        if collection.collectible_collections:
            context['reload_urls_start_with'] += [cc.get_add_url() for cc in collection.collectible_collections.values()]

    context['is_last_page'] = context['page'] == context['total_pages']
    context['page_size'] = page_size
    context['show_no_result'] = not ajax or context['ajax_modal_only']
    context['show_search_results'] = collection.list_view.show_search_results and filled_filter_form
    context['show_owner'] = 'show_owner' in request.GET
    context['get_started'] = 'get_started' in request.GET
    context['name'] = name
    context['title'] = collection.title
    context['reportable'] = collection.reportable
    context['hide_sidebar'] = collection.list_view.hide_sidebar
    context['before_template'] = collection.list_view.before_template
    context['no_result_template'] = collection.list_view.no_result_template
    context['after_template'] = collection.list_view.after_template
    context['item_template'] = collection.list_view.item_template
    context['hide_icons'] = collection.list_view.hide_icons
    context['item_blocked_template'] = collection.list_view.item_blocked_template
    if context['alt_view'] and 'template' in context['alt_view']:
        context['item_template'] = context['alt_view']['template']
    context['item_padding'] = collection.list_view.item_padding
    context['show_title'] = collection.list_view.show_title
    context['plural_title'] = collection.plural_title
    context['show_items_names'] = collection.list_view.show_items_names
    context['lowercase_plural_title'] = collection.plural_title.lower()
    context['ajax_pagination'] = collection.list_view.ajax
    context['ajax_pagination_callback'] = collection.list_view.ajax_pagination_callback
    if not ajax or context['ajax_modal_only']:
        # Should only be called once
        context['ajax_callback'] = collection.list_view.ajax_callback
    context['ajax'] = ajax
    context['js_files'] = collection.list_view.js_files
    context['share_image'] = _get_share_image(context, collection.list_view)
    context['full_width'] = collection.list_view.full_width
    if context['alt_view'] and 'full_width' in context['alt_view']:
        context['full_width'] = context['alt_view']['full_width']
    context['display_style'] = collection.list_view.display_style
    if context['alt_view'] and 'display_style' in context['alt_view']:
        context['display_style'] = context['alt_view']['display_style']
    if context['display_style'] == 'table' and context['item_template'] == 'default_item_in_list':
        context['item_template'] = 'default_item_table_view'
    context['display_style_table_classes'] = collection.list_view.display_style_table_classes
    context['display_style_table_fields'] = collection.list_view.display_style_table_fields
    if context['alt_view'] and 'display_style_table_fields' in context['alt_view']:
        context['display_style_table_fields'] = context['alt_view']['display_style_table_fields']
    context['col_break'] = collection.list_view.col_break
    context['per_line'] = int(request.GET['max_per_line']) if 'max_per_line' in request.GET and int(request.GET['max_per_line']) < collection.list_view.per_line else collection.list_view.per_line
    if context['alt_view'] and 'per_line' in context['alt_view']:
        context['per_line'] = context['alt_view']['per_line']
    context['col_size'] = _get_col_size(context['per_line'])
    context['ajax_item_popover'] = collection.list_view.ajax_item_popover
    context['item_view_enabled'] = collection.item_view.enabled
    context['ajax_item_view_enabled'] = context['item_view_enabled'] and collection.item_view.ajax and not context['ajax_item_popover']
    context['include_below_item'] = False # May be set to true below
    context['collection'] = collection

    if context['display_style'] == 'table':
        context['table_fields_headers'] = collection.list_view.table_fields_headers(context['display_style_table_fields'], view=context['view'])
        context['table_fields_headers_sections'] = collection.list_view.table_fields_headers_sections(view=context['view'])

    if not ajax or context['ajax_show_top_buttons']:
        context['top_buttons'] = collection.list_view.top_buttons(request, context)
        context['top_buttons_total'] = len([True for b in context['top_buttons'].values() if b['show'] and b['has_permissions']])
        if context['top_buttons_total']:
            context['top_buttons_col_size'] = _get_col_size(context['top_buttons_total'])

    context['show_item_buttons'] = collection.list_view.show_item_buttons
    for i, item in enumerate(queryset):
        item.request = request
        if collection.list_view.foreach_items:
            collection.list_view.foreach_items(i, item, context)
        if context.get('show_relevant_fields_on_ordering', False):
            context['include_below_item'] = True
            item.relevant_fields_to_show = collection.list_view.ordering_fields(item, only_fields=context['plain_ordering'], request=request)
        if context['display_style'] == 'table':
            item.table_fields = collection.list_view.table_fields(item, only_fields=context['display_style_table_fields'], force_all_fields=True, request=request)
        item.buttons_to_show = collection.list_view.buttons_per_item(request, context, item)
        if 'only_show_buttons' in request.GET:
            only_show_buttons = request.GET['only_show_buttons'].split(',')
            for button_name, button in item.buttons_to_show.items():
                if button_name not in only_show_buttons:
                    button['show'] = False
        item.show_item_buttons_justified = collection.list_view.show_item_buttons_justified
        item.show_item_buttons_as_icons = collection.list_view.show_item_buttons_as_icons
        item.show_item_buttons_in_one_line = collection.list_view.show_item_buttons_in_one_line
        if collection.list_view.show_item_buttons and [True for b in item.buttons_to_show.values() if b['show'] and b['has_permissions']]:
            context['include_below_item'] = True
        if request.user.is_authenticated() and collection.blockable:
            if item.owner_id in request.user.preferences.cached_blocked_ids:
                item.blocked = True
                try:
                    username = item.owner.username
                except AttributeError:
                    username = _('this user')
                item.blocked_message = _(u'You blocked {username}.').format(username=username)
                item.unblock_button = _(u'Unblock {username}').format(username=username)
            elif item.owner_id in request.user.preferences.cached_blocked_by_ids:
                item.blocked_by_owner = True

    collection.list_view.extra_context(context)

    if ajax:
        context['include_template'] = 'collections/list_page'
        if context['ajax_modal_only'] and context['ajax_pagination_callback']:
            context['ajax_callback'] = context['ajax_pagination_callback']
        return render(request, 'ajax.html', context)
    return render(request, 'collections/list_view.html', context)
Пример #9
0
def settings(request):
    context = getGlobalContext(request)
    redirectWhenNotAuthenticated(request, context, next_title=_('Settings'))
    context['preferences'] = request.user.preferences
    context['accounts'] = request.user.accounts.all()
    context['add_account_sentence'] = _(u'Add {thing}').format(
        thing=_('Account'))
    context['add_link_sentence'] = _(u'Add {thing}').format(thing=_('Link'))
    context['delete_link_sentence'] = _(u'Delete {thing}').format(
        thing=_('Link'))
    context['global_outside_permissions'] = GLOBAL_OUTSIDE_PERMISSIONS
    context['forms'] = OrderedDict([
        ('preferences',
         UserPreferencesForm(instance=context['preferences'],
                             request=request)),
        ('form', UserForm(instance=request.user, request=request)),
        ('changePassword', ChangePasswordForm(request=request)),
        ('emails', EmailsPreferencesForm(request=request)),
        ('security',
         SecurityPreferencesForm(instance=context['preferences'],
                                 request=request)),
        ('addLink', AddLinkForm(request=request)),
    ])
    if request.method == 'POST':
        for (form_name, form) in context['forms'].items():
            if form_name in request.POST:
                if form_name == 'form':
                    form = UserForm(request.POST,
                                    instance=request.user,
                                    request=request)
                    if form.is_valid():
                        form.save()
                        models.onUserEdited(request.user)
                        if ON_USER_EDITED:
                            ON_USER_EDITED(request.user)
                        redirectToProfile(request)
                elif form_name == 'preferences':
                    form = UserPreferencesForm(request.POST,
                                               instance=context['preferences'],
                                               request=request)
                    if form.is_valid():
                        form.save()
                        models.onPreferencesEdited(request.user)
                        if ON_PREFERENCES_EDITED:
                            ON_PREFERENCES_EDITED(request.user)
                        redirectToProfile(request)
                elif form_name == 'addLink':
                    form = AddLinkForm(request.POST, request=request)
                    if form.is_valid():
                        form.save()
                elif form_name == 'changePassword':
                    form = ChangePasswordForm(request.POST, request=request)
                    if form.is_valid():
                        form.save()
                        redirectToProfile(request)
                elif form_name == 'emails':
                    form = EmailsPreferencesForm(request.POST, request=request)
                    if form.is_valid():
                        form.save()
                        redirectToProfile(request)
                elif form_name == 'security':
                    form = SecurityPreferencesForm(
                        request.POST,
                        instance=context['preferences'],
                        request=request)
                    if form.is_valid():
                        form.save()
                        models.onPreferencesEdited(request.user)
                        if ON_PREFERENCES_EDITED:
                            ON_PREFERENCES_EDITED(request.user)
                        redirectToProfile(request)
                context['forms'][form_name] = form
    context['links'] = list(request.user.links.all())
    context['blocked'] = list(request.user.preferences.blocked.all())
    for blocked_user in context['blocked']:
        blocked_user.block_message = _(u'You blocked {username}.').format(
            username=blocked_user.username)
        blocked_user.unblock_message = _(u'Unblock {username}').format(
            username=blocked_user.username)
    context['js_files'] = ['settings']
    filter_cuteform = {
        'i_language': {
            'type': CuteFormType.Images,
            'image_folder': 'language',
        },
        'color': {
            'type': CuteFormType.Images,
        },
    }
    for i in range(1, 4):
        filter_cuteform['favorite_character{}'.format(i)] = {
            'to_cuteform': lambda k, v: FAVORITE_CHARACTERS_IMAGES[k],
            'extra_settings': {
                'modal': 'true',
                'modal-text': 'true',
            },
        }
    cuteFormFieldsForContext(filter_cuteform, context,
                             context['forms']['preferences'])
    cuteFormFieldsForContext(
        {
            'type': {
                'image_folder': 'links',
            },
            'relevance': {
                'type': CuteFormType.HTML,
            },
        }, context, context['forms']['addLink'])
    return render(request, 'pages/settings.html', context)