326 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			326 lines
		
	
	
		
			10 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, HttpResponseForbidden
 | |
| 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 = {'authenticated' : True, 'user_to_edit' : user, 'form' : form, 'edited' : edited}
 | |
| 
 | |
|     return render(request, 'edit_user.html', c)
 | |
| 
 | |
| def _prepare_note_context(user):
 | |
|     if not user.is_authenticated():
 | |
|         return {
 | |
|             'authenticated' : False,
 | |
|         }
 | |
| 
 | |
|     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,
 | |
|         'authenticated' : True,
 | |
|         '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:
 | |
|         note = Note(visibility=user.home_notes_visibility)
 | |
|         form = NoteForm(instance=note)
 | |
| 
 | |
|     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)
 | |
| 
 | |
| def public_note(request, user_id, note_id):
 | |
|     user = request.user
 | |
| 
 | |
|     try:
 | |
|         note = Note.objects.get(pk=note_id, author=user_id)
 | |
|     except:
 | |
|         raise Http404
 | |
| 
 | |
|     if note is None:
 | |
|         raise Http404
 | |
| 
 | |
|     if not user or not user.is_authenticated():
 | |
|         if note.visibility != Note.PUBLIC:
 | |
|             return HttpResponseForbidden()
 | |
|     else:
 | |
|         if note.visibility == Note.PRIVATE and\
 | |
|            user_id != user.id:
 | |
|             return HttpResponseForbidden()
 | |
| 
 | |
|     if user.is_authenticated():
 | |
|         public_notes = Note.objects.filter(author=user_id, visibility__gte=Note.REGISTERED).order_by('-modified_date')
 | |
|     else:
 | |
|         public_notes = Note.objects.filter(author=user_id, visibility__gte=Note.PUBLIC).order_by('-modified_date')
 | |
| 
 | |
|     context = _prepare_note_context(user)
 | |
|     context['note'] = note
 | |
|     context['public_notes'] = public_notes
 | |
| 
 | |
|     return render(request, 'public_note.html', context)
 | |
| 
 | |
| def public_notes(request):
 | |
|     user = request.user
 | |
| 
 | |
|     if user.is_authenticated():
 | |
|         public_notes = Note.objects.filter(visibility__gte=Note.REGISTERED).order_by('-modified_date')
 | |
|     else:
 | |
|         public_notes = Note.objects.filter(visibility__gte=Note.PUBLIC).order_by('-modified_date')
 | |
| 
 | |
|     context = _prepare_note_context(user)
 | |
|     context['notes'] = public_notes[:50]
 | |
|     context['public_notes'] = public_notes[:50]
 | |
| 
 | |
|     return render(request, 'public_notes.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
 | |
| 
 | |
| 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)
 | |
| 
 | |
|     if request.user.is_authenticated():
 | |
|         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)
 | |
|     else:
 | |
|         notes = Note.objects.filter(pk__in=note_list, visibility__gte=Note.PUBLIC)
 | |
|         context['notes'] = notes
 | |
|         return render(request, 'public_notes.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('/')
 |