Denote/denote/views.py

270 lines
8.2 KiB
Python

# -*- coding: utf-8 -*-
"""
Copyright 2015 Grégory Soutadé
This file is part of Dénote.
Dénote is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Dénote 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 Dénote. If not, see <http://www.gnu.org/licenses/>.
"""
import os
from datetime import datetime
from django.http import HttpResponseRedirect, HttpResponse, Http404
from django.contrib.auth.decorators import login_required
from django.contrib.auth import authenticate, login, logout
from django.shortcuts import render
from denote.models import *
from denote.forms import *
from denote.search import *
def index(request):
if request.user.is_authenticated():
return user_home(request, request.user)
login_failed = False
if 'login' in request.POST:
user = authenticate(username=request.POST['login'], password=request.POST['password'])
if user is None:
login_failed = True
else:
login(request, user)
if 'next' in request.GET:
return HttpResponseRedirect(request.GET['next'])
elif 'next' in request.POST:
return HttpResponseRedirect(request.POST['next'])
else:
return user_home(request, request.user)
c = {
'login_failed' : login_failed,
'nb_people_registered' : User.objects.all().count()
}
return render(request, 'login.html', c)
def disconnect(request):
user = request.user
if not user is None:
logout(request)
return HttpResponseRedirect('/')
def new_user(request):
login_val = 'login' in request.POST and request.POST['login'] or ''
password = 'password' in request.POST and request.POST['password'] or ''
if request.method == 'POST':
if 'add' in request.POST:
form = UserForm(request.POST)
if form.is_valid():
form = form.save()
user = User.objects.get(pk=form.id)
user.set_password(request.POST['password'])
user.save()
user = authenticate(username=user.username, password=request.POST['password'])
login(request, user)
return user_home(request, user)
else:
return HttpResponseRedirect('/')
else:
form = UserForm()
c = {'login' : login_val, 'password' : password, 'form': form}
return render(request, 'add_user.html', c)
@login_required
def edit_user(request):
user = request.user
edited = False
if request.method == 'POST':
if 'edit' in request.POST:
form = UserForm(request.POST, instance=user, initial={'password':''})
if form.is_valid():
form.save()
if request.POST['password'] != '':
user.set_password(request.POST['password'])
user.save()
edited = True
else:
if 'delete' in request.POST:
logout(request)
User.objects.filter(pk=user.id).delete()
return HttpResponseRedirect('/')
else:
login = 'login' in request.POST and request.POST['login'] or ''
form = UserForm(instance=user, initial={'password':'', 'login':login})
c = {'user_to_edit' : user, 'form' : form, 'edited' : edited}
return render(request, 'edit_user.html', c)
def _prepare_note_context(user):
categories = Category.objects.filter(author=user.id).order_by('name')
notes_by_category = []
need_refresh = False
for category in categories:
meta_note = {}
meta_note['category'] = category.name
meta_note['category_id'] = category.id
meta_note['notes'] = Note.objects.filter(author=user,category=category).order_by('-modified_date')
if meta_note['notes']:
notes_by_category.append(meta_note)
else:
category.delete()
need_refresh = True
if need_refresh:
categories = Category.objects.filter(author=user.id).order_by('name')
notes_without_category = Note.objects.filter(author=user,category=None).order_by('-modified_date')
context = {
'user': user,
'notes_by_category': notes_by_category,
'categories': categories,
'notes_without_category': notes_without_category,
}
return context
@login_required
def user_home(request, user):
context = _prepare_note_context(user)
notes = Note.objects.filter(author=user.id).order_by('-modified_date')[:20]
context['notes'] = notes
context['note_form'] = NoteForm()
return render(request, 'user_index.html', context)
@login_required
def add_note(request):
user = request.user
if request.method == 'POST':
if 'add' in request.POST:
note = Note(author=user, created_date=datetime.now())
note.category = manage_category(user, request.POST['category'])
form = NoteForm(request.POST, instance=note)
if form.is_valid():
form.save()
return HttpResponseRedirect('/note/%d' % (note.id))
else:
if 'cancel' in request.POST:
return HttpResponseRedirect('/')
else:
form = NoteForm()
context = _prepare_note_context(user)
context['note_form'] = form
context['note'] = None
return render(request, 'user_note.html', context)
@login_required
def note(request, note_id):
user = request.user
note = Note.objects.get(pk=note_id, author=user)
if note is None:
raise Http404
form = NoteForm(instance=note)
if request.method == 'POST':
if 'edit' in request.POST:
note.category = manage_category(user, request.POST['category'])
form = NoteForm(request.POST, instance=note)
if form.is_valid():
form.save()
else:
if 'delete' in request.POST:
note.delete()
return HttpResponseRedirect('/')
context = _prepare_note_context(user)
context['note'] = note
context['note_form'] = form
return render(request, 'user_note.html', context)
@login_required
def edit_category(request, category_id):
user = request.user
category = Category.objects.get(pk=category_id, author=user)
if category is None:
raise Http404
if request.method == 'POST':
if not 'new_cat_name' in request.POST or \
not request.POST['new_cat_name']:
return HttpResponseRedirect('/')
category.name = request.POST['new_cat_name'].strip()
if len(category.name) > 50: category.name = category.name[:50]
category.author = user
try:
category.save()
except:
pass
return HttpResponseRedirect('/')
@login_required
def preferences(request):
if request.method != 'POST':
raise Http404
if 'get' in request.POST and 'name' in request.POST:
return request.user.getPreference(request.POST['name'])
elif 'set' in request.POST and 'name' in request.POST and \
'value' in request.POST:
return request.user.setPreference(request.POST['name'], request.POST['value'])
else:
raise Http404
@login_required
def search(request):
context = _prepare_note_context(request.user)
ref = request.META['HTTP_REFERER']
if 'text' in request.POST:
text = request.POST['text']
else:
return HttpResponseRedirect(ref)
s = Search()
note_list = s.search(text)
notes = Note.objects.filter(pk__in=note_list, author=request.user)
context['notes'] = notes
context['note_form'] = NoteForm()
return render(request, 'user_index.html', context)
@login_required
def generate_search_index(request):
if os.path.exists('_search.db'):
os.path.remove('_search.db')
s = Search()
s.generate_index(Note.objects.all())
return HttpResponseRedirect('/')