Coverage for src/django_resume/tokens.py: 49%
57 statements
« prev ^ index » next coverage.py v7.6.1, created at 2024-09-23 13:16 +0200
« prev ^ index » next coverage.py v7.6.1, created at 2024-09-23 13:16 +0200
1import random
2import string
3from datetime import datetime
5from django import forms
6from django.urls import reverse
7from django.utils import timezone
8from django.utils.safestring import mark_safe
10from .plugins import ListPlugin, ListItemFormMixin
13def generate_random_string(length=20):
14 return "".join(random.choices(string.ascii_letters + string.digits, k=length))
17class HTMLLinkWidget(forms.Widget):
18 def render(self, name, value, attrs=None, renderer=None):
19 return mark_safe(value) if value else ""
22class TokenItemForm(ListItemFormMixin, forms.Form):
23 token = forms.CharField(max_length=255, required=True, label="Token")
24 receiver = forms.CharField(max_length=255)
25 created = forms.DateTimeField(widget=forms.HiddenInput(), required=False)
26 cv_link = forms.CharField(required=False, label="CV Link", widget=HTMLLinkWidget())
28 def __init__(self, *args, **kwargs):
29 super().__init__(*args, **kwargs)
31 if not self.initial.get("token"):
32 self.fields["token"].initial = generate_random_string()
33 self.token = self.initial.get("token") or self.fields["token"].initial
35 if "created" in self.initial and isinstance(self.initial["created"], str):
36 self.initial["created"] = datetime.fromisoformat(self.initial["created"])
37 else:
38 # Set the 'created' field to the current time if it's not already set
39 self.fields["created"].initial = timezone.now()
41 self.generate_cv_link(self.person)
43 def generate_cv_link(self, person):
44 base_url = reverse("django_resume:cv", kwargs={"slug": person.slug})
45 link = f"{base_url}?token={self.token}"
46 self.fields["cv_link"].initial = mark_safe(
47 f'<a href="{link}" target="_blank">{link}</a>'
48 )
50 def clean_token(self):
51 token = self.cleaned_data["token"]
52 if not token:
53 raise forms.ValidationError("Token required.")
54 return token
56 def clean_created(self):
57 created = self.cleaned_data["created"]
58 return created.isoformat()
60 def clean(self):
61 cleaned_data = super().clean()
62 cleaned_data.pop("cv_link", None) # Remove 'cv_link' from cleaned_data
63 return cleaned_data
66class TokenForm(forms.Form):
67 token_required = forms.BooleanField(required=False, label="Token Required")
70class TokenPlugin(ListPlugin):
71 """
72 Generate tokens for a person.
74 If you want to restrict access to a person's resume, you can generate a token.
75 The token can be shared with the person and they can access their resume using the token.
76 """
78 name = "token"
79 verbose_name = "CV Token"
80 flat_template = "django_resume/plain/token_flat.html"
81 flat_form_template = "django_resume/plain/token_flat_form.html"
83 def get_admin_item_form(self):
84 return TokenItemForm
86 def get_admin_form(self):
87 return TokenForm
89 def get_context(self, plugin_data, _person_pk, *, context):
90 print("token_data: ", plugin_data)
91 return {}