|
@@ -1,4 +1,6 @@
|
|
from django import forms
|
|
from django import forms
|
|
|
|
+from django.db.models import Q
|
|
|
|
+from django.utils.six import text_type
|
|
|
|
|
|
|
|
|
|
__all__ = [
|
|
__all__ = [
|
|
@@ -36,17 +38,22 @@ class ProfileField(object):
|
|
def clean_admin_form(self, form, data):
|
|
def clean_admin_form(self, form, data):
|
|
return data
|
|
return data
|
|
|
|
|
|
- def admin_update_extra(self, user, cleaned_data):
|
|
|
|
|
|
+ def admin_update_profile_fields(self, user, cleaned_data):
|
|
if self.readonly:
|
|
if self.readonly:
|
|
return
|
|
return
|
|
|
|
|
|
- user.extra[self.fieldname] = cleaned_data.get(self.fieldname)
|
|
|
|
|
|
+ user.profile_fields[self.fieldname] = cleaned_data.get(self.fieldname)
|
|
|
|
+
|
|
|
|
+ def admin_search(self, criteria, queryset):
|
|
|
|
+ return Q(**{
|
|
|
|
+ 'profile_fields__{}__contains'.format(self.fieldname): criteria
|
|
|
|
+ })
|
|
|
|
|
|
|
|
|
|
class ChoiceProfileField(ProfileField):
|
|
class ChoiceProfileField(ProfileField):
|
|
choices = None
|
|
choices = None
|
|
|
|
|
|
- def get_choices(self, user):
|
|
|
|
|
|
+ def get_choices(self, user=None):
|
|
if not self.choices:
|
|
if not self.choices:
|
|
raise NotImplementedError(
|
|
raise NotImplementedError(
|
|
"profile field ChoiceProfileField has to define "
|
|
"profile field ChoiceProfileField has to define "
|
|
@@ -58,19 +65,33 @@ class ChoiceProfileField(ProfileField):
|
|
return forms.ChoiceField(
|
|
return forms.ChoiceField(
|
|
label=self.get_label(user),
|
|
label=self.get_label(user),
|
|
help_text=self.get_help_text(user),
|
|
help_text=self.get_help_text(user),
|
|
- initial=user.extra.get(self.fieldname),
|
|
|
|
|
|
+ initial=user.profile_fields.get(self.fieldname),
|
|
choices=self.get_choices(user),
|
|
choices=self.get_choices(user),
|
|
disabled=self.readonly,
|
|
disabled=self.readonly,
|
|
required=False,
|
|
required=False,
|
|
)
|
|
)
|
|
|
|
|
|
|
|
+ def admin_search(self, criteria, queryset):
|
|
|
|
+ """custom search implementation for choice fields"""
|
|
|
|
+ q_obj = Q(**{
|
|
|
|
+ 'profile_fields__{}__contains'.format(self.fieldname): criteria
|
|
|
|
+ })
|
|
|
|
+
|
|
|
|
+ for key, choice in self.get_choices():
|
|
|
|
+ if key and criteria.lower() in text_type(choice).lower():
|
|
|
|
+ q_obj = q_obj | Q(**{
|
|
|
|
+ 'profile_fields__{}'.format(self.fieldname): key
|
|
|
|
+ })
|
|
|
|
+
|
|
|
|
+ return q_obj
|
|
|
|
+
|
|
|
|
|
|
class TextProfileField(ProfileField):
|
|
class TextProfileField(ProfileField):
|
|
def get_admin_field(self, user):
|
|
def get_admin_field(self, user):
|
|
return forms.CharField(
|
|
return forms.CharField(
|
|
label=self.get_label(user),
|
|
label=self.get_label(user),
|
|
help_text=self.get_help_text(user),
|
|
help_text=self.get_help_text(user),
|
|
- initial=user.extra.get(self.fieldname),
|
|
|
|
|
|
+ initial=user.profile_fields.get(self.fieldname),
|
|
max_length=250,
|
|
max_length=250,
|
|
disabled=self.readonly,
|
|
disabled=self.readonly,
|
|
required=False,
|
|
required=False,
|
|
@@ -82,7 +103,7 @@ class TextareaProfileField(ProfileField):
|
|
return forms.CharField(
|
|
return forms.CharField(
|
|
label=self.get_label(user),
|
|
label=self.get_label(user),
|
|
help_text=self.get_help_text(user),
|
|
help_text=self.get_help_text(user),
|
|
- initial=user.extra.get(self.fieldname),
|
|
|
|
|
|
+ initial=user.profile_fields.get(self.fieldname),
|
|
max_length=250,
|
|
max_length=250,
|
|
widget=forms.Textarea(
|
|
widget=forms.Textarea(
|
|
attrs={'rows': 4},
|
|
attrs={'rows': 4},
|
|
@@ -97,7 +118,7 @@ class SlugProfileField(ProfileField):
|
|
return forms.SlugField(
|
|
return forms.SlugField(
|
|
label=self.get_label(user),
|
|
label=self.get_label(user),
|
|
help_text=self.get_help_text(user),
|
|
help_text=self.get_help_text(user),
|
|
- initial=user.extra.get(self.fieldname),
|
|
|
|
|
|
+ initial=user.profile_fields.get(self.fieldname),
|
|
max_length=250,
|
|
max_length=250,
|
|
disabled=self.readonly,
|
|
disabled=self.readonly,
|
|
required=False,
|
|
required=False,
|
|
@@ -109,7 +130,7 @@ class UrlProfileField(ProfileField):
|
|
return forms.URLField(
|
|
return forms.URLField(
|
|
label=self.get_label(user),
|
|
label=self.get_label(user),
|
|
help_text=self.get_help_text(user),
|
|
help_text=self.get_help_text(user),
|
|
- initial=user.extra.get(self.fieldname),
|
|
|
|
|
|
+ initial=user.profile_fields.get(self.fieldname),
|
|
max_length=250,
|
|
max_length=250,
|
|
disabled=self.readonly,
|
|
disabled=self.readonly,
|
|
required=False,
|
|
required=False,
|