Commit 66a0aaa0 authored by Arno Töll's avatar Arno Töll
Browse files

Store filters in the query string, make it possible to store the filter list in the client session

parent e85ce772
...@@ -64,7 +64,7 @@ def make_map(config): ...@@ -64,7 +64,7 @@ def make_map(config):
map.connect('intro-maintainers', '/intro-maintainers', map.connect('intro-maintainers', '/intro-maintainers',
controller='index', action='intro_maintainers') controller='index', action='intro_maintainers')
map.connect('sponsors', '/sponsors', controller='sponsor', action='index') map.connect('sponsors', '/sponsors', controller='sponsor', action='index')
map.connect('sponsor_tag_toggle', '/sponsors/toggle/{tag}', controller='sponsor', action='toggle') map.connect('sponsor_tag_save', '/sponsors/save', controller='sponsor', action='save')
map.connect('sponsor_tag_clear', '/sponsors/clear', controller='sponsor', action='clear') map.connect('sponsor_tag_clear', '/sponsors/clear', controller='sponsor', action='clear')
map.connect('intro-reviewers', '/intro-reviewers', controller='index', action='intro_reviewers') map.connect('intro-reviewers', '/intro-reviewers', controller='index', action='intro_reviewers')
map.connect('my', '/my', controller='my', action='index') map.connect('my', '/my', controller='my', action='index')
......
...@@ -38,7 +38,7 @@ __license__ = 'MIT' ...@@ -38,7 +38,7 @@ __license__ = 'MIT'
import logging import logging
from debexpo.lib.base import BaseController, c, config, render, session, \ from debexpo.lib.base import BaseController, c, config, render, session, \
redirect, url, abort redirect, url, abort, request
from debexpo.lib import constants from debexpo.lib import constants
from debexpo.model.sponsor_metrics import SponsorMetrics, SponsorTags, SponsorMetricsTags from debexpo.model.sponsor_metrics import SponsorMetrics, SponsorTags, SponsorMetricsTags
from debexpo.model.users import User from debexpo.model.users import User
...@@ -51,6 +51,28 @@ log = logging.getLogger(__name__) ...@@ -51,6 +51,28 @@ log = logging.getLogger(__name__)
class SponsorController(BaseController): class SponsorController(BaseController):
def _validate_tags(self, tags, existing_tags = None):
"""
Validates a list of tags with actual existing ones
```tags```
A list of tags which need to be verified
```existing_tags````
The list of existing tags. Might be None to let this method fetch the tag list
"""
if not existing_tags:
existing_tags = [tag.tag for tag in meta.session.query(SponsorTags).all()]
else:
existing_tags = [tag.tag for tag in existing_tags]
for tag in tags:
if not tag in existing_tags:
return False
return True
def clear(self): def clear(self):
""" """
Clear applied filters in the session. Clear applied filters in the session.
...@@ -65,7 +87,7 @@ class SponsorController(BaseController): ...@@ -65,7 +87,7 @@ class SponsorController(BaseController):
redirect(url('sponsors')) redirect(url('sponsors'))
def toggle(self, tag): def save(self):
""" """
Toggle a filter within the session. Toggle a filter within the session.
This method prepares a list of filters to limit results in the sponsor list This method prepares a list of filters to limit results in the sponsor list
...@@ -74,18 +96,14 @@ class SponsorController(BaseController): ...@@ -74,18 +96,14 @@ class SponsorController(BaseController):
list remove it, add it otherwise. list remove it, add it otherwise.
""" """
if tag not in [x.tag for x in meta.session.query(SponsorTags).all()]: tags = request.params.getall('t')
if not self._validate_tags(tags):
abort(404) abort(404)
if 'sponsor_filters' not in session: if 'sponsor_filters' not in session:
session['sponsor_filters'] = [] session['sponsor_filters'] = []
if tag in session['sponsor_filters']: session['sponsor_filters'] = tags
log.debug("Removing tag %s from the filter list" % (tag))
session['sponsor_filters'].remove(tag)
else:
log.debug("Adding tag %s to the filter list" % (tag))
session['sponsor_filters'].append(tag)
session.save() session.save()
redirect(url('sponsors')) redirect(url('sponsors'))
...@@ -131,9 +149,13 @@ class SponsorController(BaseController): ...@@ -131,9 +149,13 @@ class SponsorController(BaseController):
c.sponsor_filter = session['sponsor_filters'] c.sponsor_filter = session['sponsor_filters']
else: else:
c.sponsor_filter = [] c.sponsor_filter = []
if request.params.getall('t'):
c.sponsor_filter = request.params.getall('t')
c.technical_tags = meta.session.query(SponsorTags).filter_by(tag_type=constants.SPONSOR_METRICS_TYPE_TECHNICAL).all() c.technical_tags = meta.session.query(SponsorTags).filter_by(tag_type=constants.SPONSOR_METRICS_TYPE_TECHNICAL).all()
c.social_tags = meta.session.query(SponsorTags).filter_by(tag_type=constants.SPONSOR_METRICS_TYPE_SOCIAL).all() c.social_tags = meta.session.query(SponsorTags).filter_by(tag_type=constants.SPONSOR_METRICS_TYPE_SOCIAL).all()
if not self._validate_tags(c.sponsor_filter, c.technical_tags + c.social_tags):
abort(404)
return render('/sponsor/index.mako') return render('/sponsor/index.mako')
...@@ -44,12 +44,20 @@ To help you find a sponsor interested in your package, they can formulate sponso ...@@ -44,12 +44,20 @@ To help you find a sponsor interested in your package, they can formulate sponso
<%def name="tag_helper(requirement)"> <%def name="tag_helper(requirement)">
% if not c.sponsor_filter: % if not c.sponsor_filter:
<dt id="${requirement.tag}">${ requirement.label } (${ h.tags.link_to( _('Filter'), h.url.current(action='toggle', tag=requirement.tag)) })</dt> <dt id="${requirement.tag}">${ requirement.label } (${ h.tags.link_to( _('Filter'), h.url.current(action='index', t=requirement.tag)) })</dt>
<dd>${ requirement.long_description | n}</dd> <dd>${ requirement.long_description | n}</dd>
% elif requirement.tag not in c.sponsor_filter: % elif requirement.tag not in c.sponsor_filter:
<dt><span id="${requirement.tag}" style="text-decoration: line-through;">${ requirement.label }</span> (${ h.tags.link_to( _('Add to filter'), h.url.current(action='toggle', tag=requirement.tag)) })</dt> <%
new_tag_list = c.sponsor_filter[:]
new_tag_list.append(requirement.tag)
%>
<dt><span id="${requirement.tag}" style="text-decoration: line-through;">${ requirement.label }</span> (${ h.tags.link_to( _('Add to filter'), h.url.current(action='index', t=new_tag_list)) })</dt>
% else: % else:
<dt id="${requirement.tag}">${ requirement.label } (${ h.tags.link_to( _('Remove filter'), h.url.current(action='toggle', tag=requirement.tag)) })</dt> <%
new_tag_list = c.sponsor_filter[:]
new_tag_list.remove(requirement.tag)
%>
<dt id="${requirement.tag}">${ requirement.label } (${ h.tags.link_to( _('Remove filter'), h.url.current(action='index', t=new_tag_list)) })</dt>
<dd>${ requirement.long_description | n}</dd> <dd>${ requirement.long_description | n}</dd>
% endif % endif
</%def> </%def>
...@@ -94,6 +102,7 @@ To help you find a sponsor interested in your package, they can formulate sponso ...@@ -94,6 +102,7 @@ To help you find a sponsor interested in your package, they can formulate sponso
% for filter in c.sponsor_filter: % for filter in c.sponsor_filter:
${ filter } ${ filter }
% endfor % endfor
- ${ h.tags.link_to( _('Store filter as default'), h.url('sponsor_tag_save', t=c.sponsor_filter)) }
- ${ h.tags.link_to( _('Remove all filters'), h.url.current(action='clear')) } - ${ h.tags.link_to( _('Remove all filters'), h.url.current(action='clear')) }
% endif % endif
</p> </p>
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment