summaryrefslogtreecommitdiffstats
path: root/users/views/admin/hashtags.py
blob: 90f7a8410e876e5fa4c7aa6899290d18a21c54ff (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
121
122
123
124
125
126
from django import forms
from django.shortcuts import get_object_or_404, redirect
from django.utils.decorators import method_decorator
from django.views.generic import FormView, TemplateView

from activities.models import Hashtag, HashtagStates
from users.decorators import admin_required


@method_decorator(admin_required, name="dispatch")
class Hashtags(TemplateView):

    template_name = "admin/hashtags.html"

    def get_context_data(self):
        return {
            "hashtags": Hashtag.objects.filter().order_by("hashtag"),
            "section": "hashtag",
        }


@method_decorator(admin_required, name="dispatch")
class HashtagCreate(FormView):

    template_name = "admin/hashtag_create.html"
    extra_context = {"section": "hashtags"}

    class form_class(forms.Form):
        hashtag = forms.SlugField(
            help_text="The hashtag without the '#'",
        )
        name_override = forms.CharField(
            help_text="Optional - a more human readable hashtag.",
            required=False,
        )
        public = forms.NullBooleanField(
            help_text="Should this hashtag appear in the UI",
            widget=forms.Select(
                choices=[(None, "Unreviewed"), (True, "Public"), (False, "Private")]
            ),
            required=False,
        )

        def clean_hashtag(self):
            hashtag = self.cleaned_data["hashtag"].lstrip("#").lower()
            if not Hashtag.hashtag_regex.match("#" + hashtag):
                raise forms.ValidationError("This does not look like a hashtag name")
            if Hashtag.objects.filter(hashtag=hashtag):
                raise forms.ValidationError("This hashtag name is already in use")
            return hashtag

        def clean_name_override(self):
            name_override = self.cleaned_data["name_override"]
            if not name_override:
                return None
            if self.cleaned_data["hashtag"] != name_override.lower():
                raise forms.ValidationError(
                    "Name override doesn't match hashtag. Only case changes are allowed."
                )
            return self.cleaned_data["name_override"]

    def form_valid(self, form):
        Hashtag.objects.create(
            hashtag=form.cleaned_data["hashtag"],
            name_override=form.cleaned_data["name_override"] or None,
            public=form.cleaned_data["public"],
        )
        return redirect(Hashtag.urls.root)


@method_decorator(admin_required, name="dispatch")
class HashtagEdit(FormView):

    template_name = "admin/hashtag_edit.html"
    extra_context = {"section": "hashtags"}

    class form_class(HashtagCreate.form_class):
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
            self.fields["hashtag"].disabled = True

        def clean_hashtag(self):
            return self.cleaned_data["hashtag"]

    def dispatch(self, request, hashtag):
        self.hashtag = get_object_or_404(Hashtag.objects, hashtag=hashtag)
        return super().dispatch(request)

    def get_context_data(self, *args, **kwargs):
        context = super().get_context_data(*args, **kwargs)
        context["hashtag"] = self.hashtag
        return context

    def form_valid(self, form):
        self.hashtag.public = form.cleaned_data["public"]
        self.hashtag.name_override = form.cleaned_data["name_override"]
        self.hashtag.save()
        Hashtag.transition_perform(self.hashtag, HashtagStates.outdated)
        return redirect(Hashtag.urls.root)

    def get_initial(self):
        return {
            "hashtag": self.hashtag.hashtag,
            "name_override": self.hashtag.name_override,
            "public": self.hashtag.public,
        }


@method_decorator(admin_required, name="dispatch")
class HashtagDelete(TemplateView):

    template_name = "admin/hashtag_delete.html"

    def dispatch(self, request, hashtag):
        self.hashtag = get_object_or_404(Hashtag.objects, hashtag=hashtag)
        return super().dispatch(request)

    def get_context_data(self):
        return {
            "hashtag": self.hashtag,
            "section": "hashtags",
        }

    def post(self, request):
        self.hashtag.delete()
        return redirect("admin_hashtags")