aboutsummaryrefslogtreecommitdiffstats
path: root/layerindex/views.py
blob: da0d2b677800d6971aae9bb938f73840f97dcb0b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# 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'

    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')