|
48 | 48 | from django.contrib.auth.models import User |
49 | 49 | from django.contrib.auth.views import login as django_login |
50 | 50 | from django.contrib.sites.models import Site |
| 51 | +from django.core.validators import ValidationError |
51 | 52 | from django.urls import reverse as urlreverse |
52 | 53 | from django.http import Http404, HttpResponseRedirect #, HttpResponse, |
53 | 54 | from django.shortcuts import render, redirect, get_object_or_404 |
|
61 | 62 | from ietf.ietfauth.htpasswd import update_htpasswd_file |
62 | 63 | from ietf.ietfauth.utils import role_required |
63 | 64 | from ietf.mailinglists.models import Subscribed, Whitelisted |
64 | | -from ietf.person.models import Person, Email, Alias |
| 65 | +from ietf.person.models import Person, Email, Alias, PersonalApiKey |
65 | 66 | from ietf.review.models import ReviewRequest, ReviewerSettings, ReviewWish |
66 | 67 | from ietf.review.utils import unavailable_periods_to_list, get_default_filter_re |
67 | | -from ietf.utils.mail import send_mail |
68 | 68 | from ietf.doc.fields import SearchableDocumentField |
| 69 | +from ietf.utils.decorators import person_required |
| 70 | +from ietf.utils.mail import send_mail |
69 | 71 |
|
70 | 72 | def index(request): |
71 | 73 | return render(request, 'registration/index.html') |
@@ -190,14 +192,10 @@ def confirm_account(request, auth): |
190 | 192 | }) |
191 | 193 |
|
192 | 194 | @login_required |
| 195 | +@person_required |
193 | 196 | def profile(request): |
194 | 197 | roles = [] |
195 | | - person = None |
196 | | - |
197 | | - try: |
198 | | - person = request.user.person |
199 | | - except Person.DoesNotExist: |
200 | | - return render(request, 'registration/missing_person.html') |
| 198 | + person = request.user.person |
201 | 199 |
|
202 | 200 | roles = Role.objects.filter(person=person, group__state='active').order_by('name__name', 'group__name') |
203 | 201 | emails = Email.objects.filter(person=person).order_by('-active','-time') |
@@ -533,13 +531,9 @@ def change_password(request): |
533 | 531 |
|
534 | 532 |
|
535 | 533 | @login_required |
| 534 | +@person_required |
536 | 535 | def change_username(request): |
537 | | - person = None |
538 | | - |
539 | | - try: |
540 | | - person = request.user.person |
541 | | - except Person.DoesNotExist: |
542 | | - return render(request, 'registration/missing_person.html') |
| 536 | + person = request.user.person |
543 | 537 |
|
544 | 538 | emails = [ e.address for e in Email.objects.filter(person=person, active=True) ] |
545 | 539 | emailz = [ e.address for e in person.email_set.filter(active=True) ] |
@@ -599,3 +593,60 @@ def login(request, extra_context=None): |
599 | 593 | } |
600 | 594 |
|
601 | 595 | return django_login(request, extra_context=extra_context) |
| 596 | + |
| 597 | +@login_required |
| 598 | +@person_required |
| 599 | +def apikey_index(request): |
| 600 | + person = request.user.person |
| 601 | + return render(request, 'ietfauth/apikeys.html', {'person': person}) |
| 602 | + |
| 603 | +@login_required |
| 604 | +@person_required |
| 605 | +def apikey_add(request): |
| 606 | + class ApiKeyForm(forms.ModelForm): |
| 607 | + class Meta: |
| 608 | + model = PersonalApiKey |
| 609 | + fields = ['endpoint'] |
| 610 | + # |
| 611 | + person = request.user.person |
| 612 | + if request.method == 'POST': |
| 613 | + form = ApiKeyForm(request.POST) |
| 614 | + if form.is_valid(): |
| 615 | + api_key = form.save(commit=False) |
| 616 | + api_key.person = person |
| 617 | + api_key.save() |
| 618 | + return redirect('ietf.ietfauth.views.apikey_index') |
| 619 | + else: |
| 620 | + form = ApiKeyForm() |
| 621 | + return render(request, 'form.html', {'form':form, 'title':"Create a new personal API key", 'description':'', 'button':'Create key'}) |
| 622 | + |
| 623 | + |
| 624 | +@login_required |
| 625 | +@person_required |
| 626 | +def apikey_del(request): |
| 627 | + person = request.user.person |
| 628 | + choices = [ (k.hash(), str(k)) for k in person.apikeys.all() ] |
| 629 | + # |
| 630 | + class KeyDeleteForm(forms.Form): |
| 631 | + hash = forms.ChoiceField(label='Key', choices=choices) |
| 632 | + def clean_key(self): |
| 633 | + hash = self.cleaned_data['hash'] |
| 634 | + key = PersonalApiKey.validate_key(hash) |
| 635 | + if key and key.person == request.user.person: |
| 636 | + return hash |
| 637 | + else: |
| 638 | + raise ValidationError("Bad key value") |
| 639 | + # |
| 640 | + if request.method == 'POST': |
| 641 | + form = KeyDeleteForm(request.POST) |
| 642 | + if form.is_valid(): |
| 643 | + hash = form.data['hash'] |
| 644 | + key = PersonalApiKey.validate_key(hash) |
| 645 | + key.delete() |
| 646 | + messages.success(request, "Deleted key %s" % hash) |
| 647 | + return redirect('ietf.ietfauth.views.apikey_index') |
| 648 | + else: |
| 649 | + messages.error(request, "Key validation failed; key not deleted") |
| 650 | + else: |
| 651 | + form = KeyDeleteForm(request.GET) |
| 652 | + return render(request, 'form.html', {'form':form, 'title':"Delete a personal API key", 'description':'', 'button':'Delete key'}) |
0 commit comments