Пример #1
0
def overview_stats(request):
    """
    Allow admins to generate fancy statistic graphs for different models
    """
    statistics_providers = []
    models_map = {}
    for model in models.get_models():
        try:
            getattr(model.objects, 'filter_overview')
            statistics_providers.append((str(model.__name__).lower(), model.statistics_name))
            models_map[str(model.__name__).lower()] = model
        except AttributeError:
            pass

    if not statistics_providers:
        """
        Something went FUBAR - Misago ships with some stats providers out of box
        If those providers cant be found, this means Misago filesystem is corrupted
        """
        return request.theme.render_to_response('overview/stats/not_available.html',
                                                context_instance=RequestContext(request));
    
    message = None
    if request.method == 'POST':
        form = GenerateStatisticsForm(request.POST, provider_choices=statistics_providers, request=request)
        if form.is_valid():
            date_start = form.cleaned_data['date_start']
            date_end = form.cleaned_data['date_end']
            if date_start > date_end:
                # Reverse dates if start is after end
                date_temp = date_end
                date_end = date_start
                date_start = date_temp
            # Assert that dates are correct
            if date_end == date_start:
                message = BasicMessage(_('Start and end date are same'), type='error')
            elif check_dates(date_start, date_end, form.cleaned_data['stats_precision']):
                message = check_dates(date_start, date_end, form.cleaned_data['stats_precision'])
            else:
                request.messages.set_flash(BasicMessage(_('Statistical report has been created.')), 'success', 'admin_stats')
                return redirect(reverse('admin_overview_graph', kwargs={
                                                       'model': form.cleaned_data['provider_model'],
                                                       'date_start': date_start.strftime('%Y-%m-%d'),
                                                       'date_end': date_end.strftime('%Y-%m-%d'),
                                                       'precision': form.cleaned_data['stats_precision']
                                                        }))
        else:
            message = Message(request, form.non_field_errors()[0])
            message.type = 'error'
    else:
        form = GenerateStatisticsForm(provider_choices=statistics_providers, request=request)
    
    return request.theme.render_to_response('overview/stats/form.html', {
                                            'form': FormLayout(form),
                                            'message': message,
                                            }, context_instance=RequestContext(request));
Пример #2
0
 def get_and_validate_target(self, request, target):
     try:
         model = self.admin.model.objects.select_related().get(pk=target)
         self.get_target(request, model)
         return model
     except self.admin.model.DoesNotExist:
         request.messages.set_flash(BasicMessage(self.notfound_message), 'error', self.admin.id)
     except ValueError as e:
         request.messages.set_flash(BasicMessage(e.args[0]), 'error', self.admin.id)
     return None
Пример #3
0
def settings_search(request):
    settings_groups = Group.objects.all().order_by('key')
    message = None
    found_settings = []
    try:
        if request.method == 'POST' and request.csrf.request_secure(request):
            form = SearchForm(request.POST, request=request)
            if form.is_valid():
                # Start search
                search_strings = SearchQuery(form.cleaned_data['search_text'])

                # Loop over groups using our search query
                for setting in Setting.objects.all().order_by('setting'):
                    if (search_strings.search(_(setting.name)) or
                        (setting.description
                         and search_strings.search(_(setting.description)))
                            or (setting.value
                                and search_strings.search(setting.value))):
                        found_settings.append(setting)

                # Scream if nothing could be found
                if found_settings:
                    message = BasicMessage(
                        ungettext(
                            'One setting that match search criteria has been found.',
                            '%(count)d settings that match search criteria have been found.',
                            len(found_settings)) % {
                                'count': len(found_settings),
                            }, 'success')
                else:
                    raise SearchException(
                        _('No settings that match search criteria has been found.'
                          ))
            else:
                raise SearchException(_('Search query is empty.'))
        else:
            raise SearchException(_('Search query is invalid.'))
    except SearchException as e:
        message = BasicMessage(e.message, 'error')
    return request.theme.render_to_response(
        'settings/search_results.html', {
            'message': message,
            'groups': settings_groups,
            'active_group': None,
            'found_settings': found_settings,
            'search_form': FormFields(form),
        },
        context_instance=RequestContext(request))
Пример #4
0
def check_dates(date_start, date_end, precision):
    date_diff = date_end - date_start
    date_diff = date_diff.seconds + date_diff.days * 86400

    if ((precision == 'day' and date_diff / 86400 > 60)
            or (precision == 'week' and date_diff / 604800 > 60)
            or (precision == 'month' and date_diff / 2592000 > 60)
            or (precision == 'year' and date_diff / 31536000 > 60)):
        return BasicMessage(_('Too many many items to display on graph.'),
                            type='error')
    elif ((precision == 'day' and date_diff / 86400 < 1)
          or (precision == 'week' and date_diff / 604800 < 1)
          or (precision == 'month' and date_diff / 2592000 < 1)
          or (precision == 'year' and date_diff / 31536000 < 1)):
        return BasicMessage(_('Too few items to display on graph'),
                            type='error')
    return None
Пример #5
0
 def __call__(self, request, target=None, slug=None):
     # Fetch target?
     model = None
     if target:
         model = self.get_and_validate_target(request, target)
         if not model:
             return redirect(self.get_fallback_url(request))
     original_model = model
         
     # Crash if this is invalid request
     if not request.csrf.request_secure(request):
         request.messages.set_flash(BasicMessage(_("Action authorization is invalid.")), 'error', self.admin.id)
         return redirect(self.get_fallback_url(request))
     
     # Do something
     message, url = self.action(request, model)
     request.messages.set_flash(message, message.type, self.admin.id)
     if url:
         return redirect(url)
     return redirect(self.get_fallback_url(request))
Пример #6
0
def overview_stats(request):
    """
    Allow admins to generate fancy statistic graphs for different models
    """
    statistics_providers = []
    models_map = {}
    for model in models.get_models():
        try:
            getattr(model.objects, 'filter_overview')
            statistics_providers.append(
                (str(model.__name__).lower(), model.statistics_name))
            models_map[str(model.__name__).lower()] = model
        except AttributeError:
            pass

    if not statistics_providers:
        """
        Something went FUBAR - Misago ships with some stats providers out of box
        If those providers cant be found, this means Misago filesystem is corrupted
        """
        return request.theme.render_to_response(
            'overview/stats/not_available.html',
            context_instance=RequestContext(request))

    message = None
    if request.method == 'POST':
        form = GenerateStatisticsForm(request.POST,
                                      provider_choices=statistics_providers,
                                      request=request)
        if form.is_valid():
            date_start = form.cleaned_data['date_start']
            date_end = form.cleaned_data['date_end']
            if date_start > date_end:
                # Reverse dates if start is after end
                date_temp = date_end
                date_end = date_start
                date_start = date_temp
            # Assert that dates are correct
            if date_end == date_start:
                message = BasicMessage(_('Start and end date are same'),
                                       type='error')
            elif check_dates(date_start, date_end,
                             form.cleaned_data['stats_precision']):
                message = check_dates(date_start, date_end,
                                      form.cleaned_data['stats_precision'])
            else:
                request.messages.set_flash(
                    BasicMessage(_('Statistical report has been created.')),
                    'success', 'admin_stats')
                return redirect(
                    reverse('admin_overview_graph',
                            kwargs={
                                'model': form.cleaned_data['provider_model'],
                                'date_start': date_start.strftime('%Y-%m-%d'),
                                'date_end': date_end.strftime('%Y-%m-%d'),
                                'precision':
                                form.cleaned_data['stats_precision']
                            }))
        else:
            message = Message(request, form.non_field_errors()[0])
            message.type = 'error'
    else:
        form = GenerateStatisticsForm(provider_choices=statistics_providers,
                                      request=request)

    return request.theme.render_to_response(
        'overview/stats/form.html', {
            'form': FormLayout(form),
            'message': message,
        },
        context_instance=RequestContext(request))
Пример #7
0
def settings(request, group_id=None, group_slug=None):
    # Load groups and find selected group
    settings_groups = Group.objects.all().order_by('key')
    if not group_id:
        active_group = settings_groups[0]
        group_id = active_group.pk
    else:
        group_id = int(group_id)
        for group in settings_groups:
            if group.pk == group_id:
                active_group = group
                break
        else:
            return error404(
                request,
                BasicMessage(
                    _('The requested settings group could not be found.')))

    # Load selected group settings and turn them into form
    group_settings = Setting.objects.filter(
        group=active_group).order_by('position')
    last_fieldset = (None, [])
    group_form = {'layout': []}
    for setting in group_settings:
        # New field subgroup?
        if setting.separator and last_fieldset[0] != setting.separator:
            if last_fieldset[0]:
                group_form['layout'].append(last_fieldset)
            last_fieldset = (_(setting.separator), [])
        last_fieldset[1].append(setting.pk)
        group_form[setting.pk] = setting.get_field()
    group_form['layout'].append(last_fieldset)
    SettingsGroupForm = type('SettingsGroupForm', (Form, ), group_form)

    #Submit form
    message = request.messages.get_message('admin_settings')
    if request.method == 'POST':
        form = SettingsGroupForm(request.POST, request=request)
        if form.is_valid():
            for setting in form.cleaned_data.keys():
                request.settings[setting] = form.cleaned_data[setting]
            request.messages.set_flash(
                BasicMessage(_('Configuration has been saved.')), 'success',
                'admin_settings')
            return redirect(
                reverse('admin_settings',
                        kwargs={
                            'group_id': active_group.pk,
                            'group_slug': active_group.key,
                        }))
        else:
            message = Message(request, form.non_field_errors()[0])
            message.type = 'error'
    else:
        form = SettingsGroupForm(request=request)

    # Display settings group form
    return request.theme.render_to_response(
        'settings/settings.html', {
            'message': message,
            'groups': settings_groups,
            'active_group': active_group,
            'search_form': FormFields(SearchForm(request=request)),
            'form': FormLayout(form),
            'raw_form': form,
        },
        context_instance=RequestContext(request))
Пример #8
0
 def __call__(self, request, page=0):
     """
     Use widget as view
     """
     # Get basic list attributes
     if request.session.get(self.get_token('filter')):
         self.is_filtering = True
         items_total = self.set_filters(self.admin.model.objects, request.session.get(self.get_token('filter'))).count()
     else:
         items_total = self.admin.model.objects.count()
     sorting_method = self.get_sorting(request)
     paginating_method = self.get_pagination(request, items_total, page)
     
     # List items
     items = self.admin.model.objects
     
     # Filter items?
     if request.session.get(self.get_token('filter')):
         items = self.set_filters(items, request.session.get(self.get_token('filter')))
     else:
         items = items.all()
                
     # Sort them
     items = self.sort_items(request, items, sorting_method);
     
     # Set pagination
     if self.pagination:
         items = items[paginating_method['start']:paginating_method['stop']]
     
     # Prefetch related?
     if self.prefetch_related:
         items = self.prefetch_related(items)
         
     # Default message
     message = request.messages.get_message(self.admin.id)
     
     # See if we should make and handle search form
     search_form = None
     SearchForm = self.get_search_form(request)
     if SearchForm:
         if request.method == 'POST':
             # New search
             if request.POST.get('origin') == 'search':
                 search_form = SearchForm(request.POST, request=request)
                 if search_form.is_valid():
                     search_criteria = {}
                     for field, criteria in search_form.cleaned_data.items():
                         if len(criteria) > 0:
                             search_criteria[field] = criteria
                     if not search_criteria:
                         message = BasicMessage(_("No search criteria have been defined."))
                     else:
                         request.session[self.get_token('filter')] = search_criteria
                         return redirect(self.get_url())
                 else:
                     message = BasicMessage(_("Search form contains errors."))
                 message.type = 'error'
             else:
                 search_form = SearchForm(request=request)
                 
             # Kill search
             if request.POST.get('origin') == 'clear' and self.is_filtering and request.csrf.request_secure(request):
                 request.session[self.get_token('filter')] = None
                 request.messages.set_flash(BasicMessage(_("Search criteria have been cleared.")), 'info', self.admin.id)
                 return redirect(self.get_url())
         else:
             if self.is_filtering:
                 search_form = SearchForm(request=request, initial=request.session.get(self.get_token('filter')))
             else:
                 search_form = SearchForm(request=request)
     
     # See if we sould make and handle tab form
     table_form = None
     TableForm = self.get_table_form(request, items)
     if TableForm:
         if request.method == 'POST' and request.POST.get('origin') == 'table':
             table_form = TableForm(request.POST, request=request)
             if table_form.is_valid():
                 message, redirect_url = self.table_action(request, items, table_form.cleaned_data)
                 if redirect_url:
                     request.messages.set_flash(message, message.type, self.admin.id)
                     return redirect(redirect_url)
             else:
                 message = Message(request, table_form.non_field_errors()[0])
                 message.type = 'error'
         else:
             table_form = TableForm(request=request)
     
     # See if we should make and handle list form
     list_form = None
     ListForm = self.get_actions_form(items)
     if ListForm:
         if request.method == 'POST' and request.POST.get('origin') == 'list':
             list_form = ListForm(request.POST, request=request)
             if list_form.is_valid():
                 try:
                     form_action = getattr(self, 'action_' + list_form.cleaned_data['list_action'])
                     message, redirect_url = form_action(request, items, list_form.cleaned_data['list_items'])
                     if redirect_url:
                         request.messages.set_flash(message, message.type, self.admin.id)
                         return redirect(redirect_url)
                 except AttributeError:
                     message = BasicMessage(_("Action requested is incorrect."))
             else:
                 if 'list_items' in list_form.errors:
                     message = BasicMessage(self.nothing_checked_message)
                 elif 'list_action' in list_form.errors:
                     message = BasicMessage(_("Action requested is incorrect."))
                 else:
                     message = Message(request, list_form.non_field_errors()[0])
             message.type = 'error'
         else:
             list_form = ListForm(request=request)
             
     # Render list
     return request.theme.render_to_response(self.get_templates(self.template),
                                             {
                                              'admin': self.admin,
                                              'action': self,
                                              'request': request,
                                              'url': self.get_url(),
                                              'message': message,
                                              'sorting': self.sortables,
                                              'sorting_method': sorting_method,
                                              'pagination': paginating_method,
                                              'list_form': FormLayout(list_form) if list_form else None,
                                              'search_form': FormLayout(search_form) if search_form else None,
                                              'table_form': FormFields(table_form).fields if table_form else None,
                                              'items': items,
                                              'items_total': items_total,
                                             },
                                             context_instance=RequestContext(request));