mirror of
git://git.yoctoproject.org/layerindex-web.git
synced 2025-07-19 20:59:01 +02:00

* Use more traditional GET instead of POST method * Search in pn, summary, description and filename instead of just pn Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com>
122 lines
4.9 KiB
Python
122 lines
4.9 KiB
Python
# layerindex-web - view definitions
|
|
#
|
|
# Copyright (C) 2013 Intel Corporation
|
|
#
|
|
# Licensed under the MIT license, see COPYING.MIT for details
|
|
|
|
from django.shortcuts import get_object_or_404, render
|
|
from django.http import HttpResponseRedirect, HttpResponse
|
|
from django.core.urlresolvers import reverse
|
|
from django.core.exceptions import PermissionDenied
|
|
from django.template import RequestContext
|
|
from layerindex.models import LayerItem, LayerMaintainer, LayerDependency, Recipe
|
|
from datetime import datetime
|
|
from django.views.generic import DetailView, ListView
|
|
from layerindex.forms import SubmitLayerForm
|
|
from django.db import transaction
|
|
from django.contrib.auth.models import User, Permission
|
|
from django.db.models import Q
|
|
from django.core.mail import EmailMessage
|
|
from django.template.loader import get_template
|
|
from django.template import Context
|
|
import simplesearch
|
|
import settings
|
|
|
|
|
|
def submit_layer(request):
|
|
if request.method == 'POST':
|
|
layeritem = LayerItem()
|
|
form = SubmitLayerForm(request.POST, instance=layeritem)
|
|
if form.is_valid():
|
|
with transaction.commit_on_success():
|
|
layeritem.created_date = datetime.now()
|
|
form.save()
|
|
# Save maintainers
|
|
for name, email in form.cleaned_data['maintainers'].items():
|
|
maint = LayerMaintainer()
|
|
maint.layer = layeritem
|
|
maint.name = name
|
|
maint.email = email
|
|
maint.save()
|
|
# Save dependencies
|
|
for dep in form.cleaned_data['deps']:
|
|
deprec = LayerDependency()
|
|
deprec.layer = layeritem
|
|
deprec.dependency = dep
|
|
deprec.save()
|
|
# Send email
|
|
plaintext = get_template('layerindex/submitemail.txt')
|
|
perm = Permission.objects.get(codename='publish_layer')
|
|
users = User.objects.filter(Q(groups__permissions=perm) | Q(user_permissions=perm) ).distinct()
|
|
for user in users:
|
|
d = Context({
|
|
'user_name': user.get_full_name(),
|
|
'layer_name': layeritem.name,
|
|
'layer_url': request.build_absolute_uri(reverse('layer_item', args=(layeritem.name,))),
|
|
})
|
|
subject = '%s - %s' % (settings.SUBMIT_EMAIL_SUBJECT, layeritem.name)
|
|
from_email = settings.SUBMIT_EMAIL_FROM
|
|
to_email = user.email
|
|
text_content = plaintext.render(d)
|
|
msg = EmailMessage(subject, text_content, from_email, [to_email])
|
|
msg.send()
|
|
return HttpResponseRedirect(reverse('submit_layer_thanks'))
|
|
else:
|
|
form = SubmitLayerForm()
|
|
|
|
return render(request, 'layerindex/submitlayer.html', {
|
|
'form': form,
|
|
})
|
|
|
|
def submit_layer_thanks(request):
|
|
return render(request, 'layerindex/submitthanks.html')
|
|
|
|
def publish(request, name):
|
|
if not (request.user.is_authenticated() and request.user.has_perm('layerindex.publish_layer')):
|
|
raise PermissionDenied
|
|
return _statuschange(request, name, 'P')
|
|
|
|
def _statuschange(request, name, newstatus):
|
|
w = get_object_or_404(LayerItem, name=name)
|
|
if w.status != newstatus:
|
|
w.change_status(newstatus, request.user.username)
|
|
w.save()
|
|
return HttpResponseRedirect(reverse('layer_item', args=(name,)))
|
|
|
|
class LayerListView(ListView):
|
|
context_object_name = 'layer_list'
|
|
paginate_by = 20
|
|
|
|
def get_queryset(self):
|
|
return LayerItem.objects.filter(status__in=self.request.session.get('status_filter', 'P')).order_by('name')
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super(LayerListView, self).get_context_data(**kwargs)
|
|
context['layer_type_choices'] = LayerItem.LAYER_TYPE_CHOICES
|
|
return context
|
|
|
|
class RecipeSearchView(ListView):
|
|
context_object_name = 'recipe_list'
|
|
paginate_by = 10
|
|
|
|
def get_queryset(self):
|
|
query_string = self.request.GET.get('q', '')
|
|
if query_string.strip():
|
|
entry_query = simplesearch.get_query(query_string, ['pn', 'summary', 'description', 'filename'])
|
|
return Recipe.objects.filter(entry_query).order_by('pn', 'layer')
|
|
else:
|
|
return Recipe.objects.all().order_by('pn', 'layer')
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super(RecipeSearchView, self).get_context_data(**kwargs)
|
|
context['search_keyword'] = self.request.GET.get('q', '')
|
|
return context
|
|
|
|
|
|
class PlainTextListView(ListView):
|
|
def render_to_response(self, context):
|
|
"Returns a plain text response rendering of the template"
|
|
template = get_template(self.template_name)
|
|
return HttpResponse(template.render(Context(context)),
|
|
content_type='text/plain')
|