• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

rafalp / Misago / 9487666026

12 Jun 2024 06:16PM UTC coverage: 97.699% (-1.0%) from 98.716%
9487666026

push

github

web-flow
Replace forum options with account settings (#1742)

1947 of 1979 new or added lines in 68 files covered. (98.38%)

661 existing lines in 143 files now uncovered.

52601 of 53840 relevant lines covered (97.7%)

0.98 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

92.86
/misago/users/profilefields/basefields.py
1
from django import forms
1✔
2
from django.db.models import Q
1✔
3
from django.utils import html
1✔
4

5
from ...core.utils import format_plaintext_for_html
1✔
6

7
__all__ = [
1✔
8
    "ProfileField",
9
    "TextProfileField",
10
    "UrlProfileField",
11
    "TextareaProfileField",
12
    "ChoiceProfileField",
13
]
14

15

16
class ProfileField:
1✔
17
    """
18
    Basic profile field
19
    """
20

21
    fieldname = None
1✔
22
    label = None
1✔
23
    help_text = None
1✔
24
    readonly = False
1✔
25

26
    def is_editable(self, request, user):
1✔
27
        return not self.readonly
1✔
28

29
    def get_label(self, user):
1✔
30
        if not self.label:
1✔
UNCOV
31
            raise NotImplementedError(
×
32
                "profile field class has to define label "
33
                "attribute or get_label(user) method"
34
            )
35
        return self.label
1✔
36

37
    def get_help_text(self, user):
1✔
38
        return self.help_text
1✔
39

40
    def get_form_field(self, request, user):
1✔
41
        return None
×
42

43
    def get_form_field_json(self, request, user):
1✔
44
        return {
1✔
45
            "fieldname": self.fieldname,
46
            "label": self.get_label(user),
47
            "help_text": self.get_help_text(user),
48
            "initial": user.profile_fields.get(self.fieldname, ""),
49
            "input": self.get_input_json(request, user),
50
        }
51

52
    def get_input_json(self, request, user):
1✔
53
        return None
×
54

55
    def clean(self, request, user, data):
1✔
56
        return data
1✔
57

58
    def get_display_data(self, request, user):
1✔
59
        value = user.profile_fields.get(self.fieldname, "").strip()
1✔
60
        if not self.readonly and not value:
1✔
61
            return None
1✔
62

63
        data = self.get_value_display_data(request, user, value)
1✔
64
        if not data:
1✔
65
            return None
1✔
66

67
        data.update({"fieldname": self.fieldname, "name": str(self.get_label(user))})
1✔
68

69
        return data
1✔
70

71
    def get_value_display_data(self, request, user, value):
1✔
72
        return {"text": value}
×
73

74
    def search_users(self, criteria):
1✔
75
        if self.readonly:
1✔
76
            return None
1✔
77

78
        return Q(**{"profile_fields__%s__contains" % self.fieldname: criteria})
1✔
79

80

81
class ChoiceProfileField(ProfileField):
1✔
82
    choices = None
1✔
83

84
    def get_choices(self, user=None):
1✔
85
        if not self.choices:
1✔
UNCOV
86
            raise NotImplementedError(
×
87
                "profile field ChoiceProfileField has to define "
88
                "choices attribute or get_choices(user) method"
89
            )
90
        return self.choices
1✔
91

92
    def get_form_field(self, request, user):
1✔
93
        return forms.ChoiceField(
1✔
94
            label=self.get_label(user),
95
            help_text=self.get_help_text(user),
96
            initial=user.profile_fields.get(self.fieldname),
97
            choices=self.get_choices(user),
98
            widget=forms.RadioSelect(),
99
            disabled=self.readonly,
100
            required=False,
101
        )
102

103
    def get_input_json(self, request, user):
1✔
104
        choices = []
1✔
105
        for key, choice in self.get_choices():  # pylint: disable=not-an-iterable
1✔
106
            choices.append({"value": key, "label": choice})
1✔
107

108
        return {"type": "select", "choices": choices}
1✔
109

110
    def get_value_display_data(self, request, user, value):
1✔
111
        for key, name in self.get_choices():  # pylint: disable=not-an-iterable
1✔
112
            if key == value:
1✔
113
                return {"text": str(name)}
1✔
114

115
    def search_users(self, criteria):
1✔
116
        """custom search implementation for choice fields"""
117
        q_obj = Q(**{"profile_fields__%s__contains" % self.fieldname: criteria})
1✔
118

119
        for key, choice in self.get_choices():  # pylint: disable=not-an-iterable
1✔
120
            if key and criteria.lower() in str(choice).lower():
1✔
121
                q_obj = q_obj | Q(**{"profile_fields__%s" % self.fieldname: key})
1✔
122

123
        return q_obj
1✔
124

125

126
class TextProfileField(ProfileField):
1✔
127
    def get_form_field(self, request, user):
1✔
128
        return forms.CharField(
1✔
129
            label=self.get_label(user),
130
            help_text=self.get_help_text(user),
131
            initial=user.profile_fields.get(self.fieldname),
132
            max_length=250,
133
            disabled=self.readonly,
134
            required=False,
135
        )
136

137
    def get_input_json(self, request, user):
1✔
138
        return {"type": "text"}
1✔
139

140

141
class TextareaProfileField(ProfileField):
1✔
142
    def get_form_field(self, request, user):
1✔
143
        return forms.CharField(
1✔
144
            label=self.get_label(user),
145
            help_text=self.get_help_text(user),
146
            initial=user.profile_fields.get(self.fieldname),
147
            max_length=500,
148
            widget=forms.Textarea(attrs={"rows": 4}),
149
            disabled=self.readonly,
150
            required=False,
151
        )
152

153
    def get_input_json(self, request, user):
1✔
154
        return {"type": "textarea"}
1✔
155

156
    def get_value_display_data(self, request, user, value):
1✔
UNCOV
157
        return {"html": html.linebreaks(html.escape(value))}
×
158

159

160
class UrlifiedTextareaProfileField(TextareaProfileField):
1✔
161
    def get_value_display_data(self, request, user, value):
1✔
162
        return {"html": format_plaintext_for_html(value)}
1✔
163

164

165
class UrlProfileField(TextProfileField):
1✔
166
    def get_form_field(self, request, user):
1✔
167
        return forms.URLField(
1✔
168
            label=self.get_label(user),
169
            help_text=self.get_help_text(user),
170
            initial=user.profile_fields.get(self.fieldname),
171
            max_length=250,
172
            disabled=self.readonly,
173
            required=False,
174
        )
175

176
    def get_value_display_data(self, request, user, value):
1✔
177
        return {"text": value, "url": value}
1✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc