views.py 9.57 KB
Newer Older
Dudás Ádám committed
1
from datetime import datetime
Őry Máté committed
2
from django.core.exceptions import ValidationError
Dudás Ádám committed
3 4
from django.conf import settings
from django.contrib.auth.decorators import login_required
Őry Máté committed
5
from django.contrib.auth.models import User, Group as AGroup
Dudás Ádám committed
6 7 8 9 10 11 12 13 14 15 16
from django.contrib import messages
from django.core.exceptions import PermissionDenied
from django.core import signing
from django.core.mail import mail_managers, send_mail
from django.db import transaction
from django.forms import ModelForm, Textarea
from django.http import Http404
from django.shortcuts import render, render_to_response, get_object_or_404, redirect
from django.template import RequestContext
from django.template.loader import render_to_string
from django.utils.decorators import method_decorator
Őry Máté committed
17
from django.utils.http import is_safe_url
Dudás Ádám committed
18 19 20 21 22
from django.utils.translation import get_language as lang
from django.utils.translation import ugettext_lazy as _
from django.views.decorators.http import *
from django.views.generic import *
from one.models import *
Őry Máté committed
23
from school.models import *
Dudás Ádám committed
24
import django.contrib.auth as auth
x committed
25
import logging
26
import json
Dányi Bence committed
27
import re
28
from django.views.decorators.csrf import ensure_csrf_cookie
x committed
29 30

logger = logging.getLogger(__name__)
Dudás Ádám committed
31 32 33 34 35

def logout(request):
    auth.logout(request)
    return redirect('/Shibboleth.sso/Logout?return=https%3a%2f%2fcloud.ik.bme.hu%2f')

36
@ensure_csrf_cookie
Dudás Ádám committed
37 38
def login(request):
    try:
39 40 41 42
        user = User.objects.get(username=request.META['niifPersonOrgID'])
    except KeyError:
        messages.error(request, _('EduID is not available.'))
        return redirect('/admin')
Dudás Ádám committed
43
    except User.DoesNotExist:
Őry Máté committed
44
        user = User(username=request.META['niifPersonOrgID'])
45 46 47
        user.set_unusable_password()
    user.first_name = request.META['givenName']
    user.last_name = request.META['sn']
Őry Máté committed
48
    user.email = request.META['email']
Dudás Ádám committed
49
    user.save()
50 51
    p, created = Person.objects.get_or_create(code=user.username)
    p.user_id = user.id
52
    p.save()
Dudás Ádám committed
53

Őry Máté committed
54 55 56
    try:
        sem = Semester.get_current()

Őry Máté committed
57 58 59
        attended = request.META['HTTP_NIIFEDUPERSONATTENDEDCOURSE']
        if attended == '':
            attended = []
Őry Máté committed
60
        else:
Őry Máté committed
61 62
            attended = attended.split(';')
        for c in attended:
63 64
            try:
                co = Course.objects.get(code=c)
Őry Máté committed
65 66
            except Exception as e:
                logger.warning("Django could not get Course %s: %s" % (c, e))
67
                continue
Őry Máté committed
68 69 70
            g = co.get_or_create_default_group()
            if p.course_groups.filter(semester=sem, course=co).count() == 0:
                try:
71 72
                    g.members.add(p)
                    g.save()
Őry Máté committed
73
                    messages.info(request, _('Course "%s" added.') % g.course)
Őry Máté committed
74
                    logger.warning('Django Course "%s" added.' % g.course)
Őry Máté committed
75
                except Exception as e:
Őry Máté committed
76
                    messages.error(request, _('Failed to add course "%s".') % g.course)
Őry Máté committed
77
                    logger.warning("Django ex %s" % e)
78 79
    except ValidationError as e:
        logger.warning("Django ex4 %s" % e)
Őry Máté committed
80

Őry Máté committed
81 82 83 84 85 86
    held = request.META['HTTP_NIIFEDUPERSONHELDCOURSE']
    if held == '':
        held = []
    else:
        held = held.split(';')
    for c in held:
Őry Máté committed
87
        co, created = Course.objects.get_or_create(code=c)
88
        if created:
Őry Máté committed
89
            logger.warning("Django Course %s created" % c)
Őry Máté committed
90 91 92 93 94
        g = co.get_or_create_default_group()
        try:
            co.owners.add(p)
            g.owners.add(p)
            messages.info(request, _('Course "%s" ownership added.') % g.course)
Őry Máté committed
95
        except Exception as e:
Őry Máté committed
96
            messages.error(request, _('Failed to add course "%s" ownership.') % g.course)
Őry Máté committed
97
            logger.warning("Django ex %s" % e)
98 99 100
        co.save()
        g.save()

101 102 103 104
    try:
        affiliation = request.META['affiliation']
    except KeyError:
        affiliation = ''
Őry Máté committed
105 106 107 108 109 110 111
    if affiliation == '':
        affiliation = []
    else:
        affiliation = affiliation.split(';')
    for a in affiliation:
        g, created = AGroup.objects.get_or_create(name=a)
        user.groups.add(g)
112
        try:
113
            g = Group.objects.filter(name=a)[0]
114 115
            g.members.add(p)
            g.save()
116
            logger.warning("Django affiliation group %s added to %s" % (a, p))
Őry Máté committed
117
        except Exception as e:
118
            logger.warning("Django FAIL affiliation group %s added to %s %s" % (a, p, e))
Őry Máté committed
119
    user.save()
Őry Máté committed
120 121

    p.save()
Dudás Ádám committed
122 123
    user.backend = 'django.contrib.auth.backends.ModelBackend'
    auth.login(request, user)
x committed
124 125
    logger.warning("Shib login with %s" % request.META)

126

Őry Máté committed
127
    redirect_to = request.REQUEST.get(auth.REDIRECT_FIELD_NAME, '')
Őry Máté committed
128 129
    if not is_safe_url(url=redirect_to, host=request.get_host()):
        redirect_to = settings.LOGIN_REDIRECT_URL
130 131 132
    response = redirect(redirect_to)
    response.set_cookie(settings.LANGUAGE_COOKIE_NAME, p.language, 10*365*24*3600)
    return response
133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153

def language(request, lang):
    cname = settings.LANGUAGE_COOKIE_NAME
    if not cname:
        cname = 'django_language'
    redirect_to = request.META['HTTP_REFERER']
    r = redirect(redirect_to)
    if not redirect_to:
        redirect_to = "/"

    try:
        p = Person.objects.get(user=request.user)
        p.language = lang
        p.save()
    except ValidationError as e:
        messages.error(e)
    except:
        messages.error(_("Could not found Person object."))
    r.set_cookie(cname, lang, 10*365*24*3600)
    return r

Dányi Bence committed
154
@login_required
155 156 157
def group_show(request, gid):
    user = request.user
    group = get_object_or_404(Group, id=gid)
158
    mytemplates = [t for t in Template.objects.filter(owner=request.user).all()]
159
    noshare = True
160 161
    for i, t in enumerate(mytemplates):
        t.myshares = t.share_set.filter(group=group)
162 163
        if t.myshares.exists():
            noshare = False
164 165 166 167
        mytemplates[i] = t
    publictemplates = [t for t in Template.objects.filter(public=True, state='READY').all()]
    for i, t in enumerate(publictemplates):
        t.myshares = t.share_set.filter(group=group)
168 169
        if t.myshares.exists():
            noshare = False
170
        publictemplates[i] = t
Dányi Bence committed
171 172
    return render_to_response("show-group.html", RequestContext(request,{
        'group': group,
173 174 175
        'members': group.members.all(),
        'mytemplates': mytemplates,
        'publictemplates': publictemplates,
176
        'noshare': noshare,
Őry Máté committed
177
        'userdetails': UserCloudDetails.objects.get(user=request.user),
178
        'owners': group.owners.all(),
Dányi Bence committed
179
        }))
Dányi Bence committed
180

181
@login_required
Dányi Bence committed
182 183 184 185 186 187
def group_new(request):
    name = request.POST['name']
    semester = Semester.objects.get(id=request.POST['semester'])
    members_list = re.split('\r?\n', request.POST['members'])
    members = []
    for member in members_list:
188
        if re.match('^[a-zA-Z][a-zA-Z0-9]{5}$', member.strip()) == None:
Dányi Bence committed
189 190
            messages.error(request, _('Invalid NEPTUN code found.'))
            return redirect('/')
Dányi Bence committed
191
        person, created = Person.objects.get_or_create(code=member)
Dányi Bence committed
192 193 194 195 196 197 198
        members.append(person)
    owner = request.user.person_set.all()[0]
    group = Group()
    group.name = name
    group.semester = semester
    group.save()
    for member in members:
Dányi Bence committed
199
        group.members.add(member)
Dányi Bence committed
200 201 202
    group.owners.add(owner)
    group.save()
    return redirect('/group/show/%s' % group.id)
203 204 205 206 207

@login_required
def group_ajax_add_new_member(request, gid):
    group = get_object_or_404(Group, id=gid)
    member = request.POST['neptun']
208
    if re.match('^[a-zA-Z][a-zA-Z0-9]{5}$', member.strip()) == None:
209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232
        status = json.dumps({'status': 'Error'})
        messages.error(request, _('Invalid NEPTUN code'))
        return HttpResponse(status)
    person, created = Person.objects.get_or_create(code=member)
    group.members.add(person)
    group.save()
    return HttpResponse(json.dumps({
        'status': 'OK'
        }))

@login_required
def group_ajax_remove_member(request, gid):
    group = get_object_or_404(Group, id=gid)
    member = request.POST['neptun']
    if re.match('^[a-zA-Z][a-zA-Z0-9]{5}$', member) == None:
        status = json.dumps({'status': 'Error'})
        messages.error(request, _('Invalid NEPTUN code'))
        return HttpResponse(status)
    person, created = Person.objects.get_or_create(code=member)
    group.members.remove(person)
    group.save()
    return HttpResponse(json.dumps({
        'status': 'OK'
        }))
Dányi Bence committed
233 234 235 236 237 238 239 240

@login_required
def group_ajax_delete(request):
    group = get_object_or_404(Group, id=request.POST['gid'])
    group.delete()
    return HttpResponse(json.dumps({
        'status': 'OK'
        }))
241 242 243

@login_required
def group_ajax_owner_autocomplete(request):
Dányi Bence committed
244

245 246
    results = map(lambda u: {
        'name': u.get_full_name(),
247
        'neptun': u.username }, User.objects.filter(last_name__istartswith=request.POST['q'])[:5])
248 249
    results += map(lambda u: {
        'name': u.get_full_name(),
250
        'neptun': u.username }, User.objects.filter(first_name__istartswith=request.POST['q'])[:5])
251 252
    results += map(lambda u: {
        'name': u.get_full_name(),
253
        'neptun': u.username }, User.objects.filter(username__istartswith=request.POST['q'])[:5])
254 255 256 257
    return HttpResponse(json.dumps(results, ensure_ascii=False))

@login_required
def group_ajax_add_new_owner(request, gid):
Dányi Bence committed
258 259
    if request.user.cloud_details.share_quota == 0:
        return HttpResponse({'status': 'denied'})
260 261 262 263 264 265 266 267 268 269 270 271
    group = get_object_or_404(Group, id=gid)
    member = request.POST['neptun']
    if re.match('^[a-zA-Z][a-zA-Z0-9]{5}$', member.strip()) == None:
        status = json.dumps({'status': 'Error'})
        messages.error(request, _('Invalid NEPTUN code'))
        return HttpResponse(status)
    person, created = Person.objects.get_or_create(code=member)
    group.owners.add(person)
    group.save()
    return HttpResponse(json.dumps({
        'status': 'OK'
        }))