Basic search structure

This commit is contained in:
Antoine Bartuccio 2017-07-22 22:35:01 +02:00
parent 0ffd7485e3
commit b7c382a1a8
11 changed files with 250 additions and 0 deletions

View File

@ -143,6 +143,17 @@ class CanViewMixin(View):
self.get_queryset = types.MethodType(get_qs, self)
return super(CanViewMixin, self).dispatch(request, *arg, **kwargs)
class WasSuscribed(View):
"""
This view check if the user was at least an old subscriber
"""
def dispatch(self, request, *args, **kwargs):
if not request.user.was_subscribed:
raise PermissionDenied
return super(WasSuscribed, self).dispatch(request, *args, **kwargs)
class TabedViewMixin(View):
"""
This view provide the basic functions for displaying tabs in the template

0
matmat/__init__.py Normal file
View File

3
matmat/admin.py Normal file
View File

@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.

View File

3
matmat/models.py Normal file
View File

@ -0,0 +1,3 @@
from django.db import models
# Create your models here.

View File

@ -0,0 +1,50 @@
{% extends "core/base.jinja" %}
{% block title %}
{% trans %}Search user{% endtrans %}
{% endblock %}
{% block content %}
{% if object_list.exists() %}
<h2>{% trans %}User found{% endtrans %}</h2>
{% for user in object_list %}
{{ user }}
{% endfor %}
{% endif %}
<h2>{% trans %}Search user{% endtrans %}</h2>
<h3>{% trans %}Search by profile{% endtrans %}</h3>
<form action="{{ url('matmat:search') }}" method="post" enctype="multipart/form-data">
{% csrf_token %}
{% for field in form %}
{% if field.name != 'phone' %}
<p>
{{ field.errors }}
<label for="{{ field.id_for_label }}">{{ field.label }}</label>
{{ field }}
</p>
{% endif %}
{% endfor %}
<p><input type="submit" value="{% trans %}Search{% endtrans %}" /></p>
</form>
<h3>{% trans %}Inverted search{% endtrans %}</h3>
<form action="{{ url('matmat:search_reverse') }}" method="post" enctype="multipart/form-data">
{% csrf_token %}
<p>
{{ form.phone.errors }}
<label for="{{ form.phone.id_for_label }}">{{ form.phone.label }}</label>
{{ form.phone }}
<p><input type="submit" value="{% trans %}Search{% endtrans %}" /></p>
</p>
</form>
<h3>{% trans %}Simple search{% endtrans %}</h3>
{% csrf_token %}
<form action="{{ url('core:search') }}" method="GET">
<label for="search">{% trans %}Last/First name or nickname{% endtrans %}</label>
<input type="text" name="query" id="search" />
<p><input type="submit" value="{% trans %}Search{% endtrans %}" /></p>
</form>
{% endblock %}
{% block script %}
{{ super() }}
{% endblock %}

3
matmat/tests.py Normal file
View File

@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

32
matmat/urls.py Normal file
View File

@ -0,0 +1,32 @@
# -*- coding:utf-8 -*
#
# Copyright 2017
# - Sli <skia@libskia.so>
#
# Ce fichier fait partie du site de l'Association des Étudiants de l'UTBM,
# http://ae.utbm.fr.
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License a published by the Free Software
# Foundation; either version 3 of the License, or (at your option) any later
# version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, write to the Free Sofware Foundation, Inc., 59 Temple
# Place - Suite 330, Boston, MA 02111-1307, USA.
#
#
from django.conf.urls import url
from matmat.views import *
urlpatterns = [
url(r'^$', SearchFormView.as_view(), name="search"),
url(r'^search_reverse$', SearchReverseFormView.as_view(), name="search_reverse"),
]

146
matmat/views.py Normal file
View File

@ -0,0 +1,146 @@
# -*- coding:utf-8 -*
#
# Copyright 2017
# - Sli <skia@libskia.so>
#
# Ce fichier fait partie du site de l'Association des Étudiants de l'UTBM,
# http://ae.utbm.fr.
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License a published by the Free Software
# Foundation; either version 3 of the License, or (at your option) any later
# version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, write to the Free Sofware Foundation, Inc., 59 Temple
# Place - Suite 330, Boston, MA 02111-1307, USA.
#
#
from django.shortcuts import render
# Create your views here.
from django.shortcuts import get_object_or_404
from django.views.generic import ListView
from django.views.generic.edit import FormView
from django.core.urlresolvers import reverse_lazy, reverse
from django.utils.translation import ugettext_lazy as _
from django.views.generic.detail import SingleObjectMixin
from django.core.exceptions import PermissionDenied
from django.db import transaction
from django.forms import CheckboxSelectMultiple
from django import forms
from core.models import User
from core.views import WasSuscribed
from core.views.forms import SelectDate
from phonenumber_field.widgets import PhoneNumberInternationalFallbackWidget
# Custom form
class SearchForm(forms.ModelForm):
class Meta:
model = User
fields = [
'first_name',
'last_name',
'nick_name',
'sex',
'role',
'department',
'semester',
'promo',
'date_of_birth',
'phone',
]
widgets = {
'date_of_birth': SelectDate,
'phone': PhoneNumberInternationalFallbackWidget,
# 'sex': CheckboxSelectMultiple,
}
def __init__(self, *args, **kwargs):
super(SearchForm, self).__init__(*args, **kwargs)
for key in self.fields.keys():
self.fields[key].required = False
self.fields['sex'].choices.append(("INDIFFERENT", _("Indifferent")))
# Views
class SearchFormListView(WasSuscribed, SingleObjectMixin, ListView):
model = User
template_name = 'matmat/search_form.jinja'
def dispatch(self, request, *args, **kwargs):
self.form_class = kwargs['form']
self.reverse = kwargs['reverse']
if 'valid_form' in kwargs.keys():
self.valid_form = kwargs['valid_form']
else:
self.valid_form = None
self.init_query = self.model.objects
if not (request.user.is_board_member or request.user.is_root):
self.init_query = self.init_query.exclude(is_subscriber_viewable=False)
return super(SearchFormListView, self).dispatch(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
return self.get(request, *args, **kwargs)
def get_context_data(self, **kwargs):
self.object = None
kwargs = super(SearchFormListView, self).get_context_data(**kwargs)
kwargs['form'] = self.form_class()
return kwargs
def get_queryset(self):
if self.valid_form is not None:
if self.reverse:
return self.init_query.filter(phone=self.valid_form['phone']).all()
else:
q = self.init_query
# f = self.valid_form
return q.all()
else:
return self.model.objects.none()
class SearchFormView(WasSuscribed, FormView):
"""
Allows users to search inside the user list
"""
form_class = SearchForm
reverse = False
def dispatch(self, request, *args, **kwargs):
self.init_query = User.objects
kwargs['form'] = self.get_form_class()
kwargs['reverse'] = self.reverse
return super(SearchFormView, self).dispatch(request, *args, **kwargs)
def get(self, request, *args, **kwargs):
view = SearchFormListView.as_view()
return view(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
form = self.get_form()
view = SearchFormListView.as_view()
if form.is_valid():
kwargs['valid_form'] = form.clean()
return view(request, *args, **kwargs)
def get_initial(self):
return super(SearchFormView, self).get_initial()
class SearchReverseFormView(SearchFormView):
reverse = True

View File

@ -87,6 +87,7 @@ INSTALLED_APPS = (
'forum',
'stock',
'trombi',
'matmat',
)
MIDDLEWARE_CLASSES = (

View File

@ -67,6 +67,7 @@ urlpatterns = [
url(r'^election/', include('election.urls', namespace="election", app_name="election")),
url(r'^forum/', include('forum.urls', namespace="forum", app_name="forum")),
url(r'^trombi/', include('trombi.urls', namespace="trombi", app_name="trombi")),
url(r'^matmatronch/', include('matmat.urls', namespace="matmat", app_name="matmat")),
url(r'^admin/', include(admin.site.urls)),
url(r'^ajax_select/', include(ajax_select_urls)),
url(r'^i18n/', include('django.conf.urls.i18n')),