views.py 6.87 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 65 66
            try:
                co = Course.objects.get(code=c)
            except:
                continue
Őry Máté committed
67 68 69
            g = co.get_or_create_default_group()
            if p.course_groups.filter(semester=sem, course=co).count() == 0:
                try:
70 71
                    g.members.add(p)
                    g.save()
Őry Máté committed
72
                    messages.info(request, _('Course "%s" added.') % g.course)
Őry Máté committed
73 74
                except Exception as e:
                    logger.warning("Django ex %s" % e)
75 76
    except ValidationError as e:
        logger.warning("Django ex4 %s" % e)
Őry Máté committed
77

Őry Máté committed
78 79 80 81 82 83
    held = request.META['HTTP_NIIFEDUPERSONHELDCOURSE']
    if held == '':
        held = []
    else:
        held = held.split(';')
    for c in held:
Őry Máté committed
84
        co, created = Course.objects.get_or_create(code=c)
85 86
        if created:
            logger.warning("django Course %s created" % c)
Őry Máté committed
87 88 89 90 91
        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
92 93
        except Exception as e:
            logger.warning("Django ex %s" % e)
94 95 96
        co.save()
        g.save()

Őry Máté committed
97

Őry Máté committed
98 99 100 101 102 103 104 105 106
    affiliation = request.META['affiliation']
    if affiliation == '':
        affiliation = []
    else:
        affiliation = affiliation.split(';')
    for a in affiliation:
        g, created = AGroup.objects.get_or_create(name=a)
        user.groups.add(g)
    user.save()
Őry Máté committed
107 108

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

113

Őry Máté committed
114
    redirect_to = request.REQUEST.get(auth.REDIRECT_FIELD_NAME, '')
Őry Máté committed
115 116
    if not is_safe_url(url=redirect_to, host=request.get_host()):
        redirect_to = settings.LOGIN_REDIRECT_URL
117 118 119
    response = redirect(redirect_to)
    response.set_cookie(settings.LANGUAGE_COOKIE_NAME, p.language, 10*365*24*3600)
    return response
120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140

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
141
@login_required
142 143 144
def group_show(request, gid):
    user = request.user
    group = get_object_or_404(Group, id=gid)
Dányi Bence committed
145 146 147 148
    return render_to_response("show-group.html", RequestContext(request,{
        'group': group,
        'members': group.members.all()
        }))
Dányi Bence committed
149

150
@login_required
Dányi Bence committed
151 152 153 154 155 156 157 158 159
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:
        if re.match('^[a-zA-Z][a-zA-Z0-9]{5}$', member) == None:
            messages.error(request, _('Invalid NEPTUN code found.'))
            return redirect('/')
Dányi Bence committed
160
        person, created = Person.objects.get_or_create(code=member)
Dányi Bence committed
161 162 163 164 165 166 167
        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
168
        group.members.add(member)
Dányi Bence committed
169 170 171
    group.owners.add(owner)
    group.save()
    return redirect('/group/show/%s' % group.id)
172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201

@login_required
def group_ajax_add_new_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.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
202 203 204 205 206 207 208 209

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