Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions app/eventyay/base/models/cfp.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ def default_settings():
'count_length_in': 'chars',
'show_deadline': True,
'hide_after_deadline': False,
'cfp_enable_gravatar': True,
}


Expand Down Expand Up @@ -171,3 +172,8 @@ def max_deadline(self) -> dt.datetime:
if self.deadline:
deadlines.append(self.deadline)
return max(deadlines) if deadlines else None

@property
def enable_gravatar(self) -> bool:
"""Check if Gravatar is enabled for this event's CfP."""
return self.settings.get('cfp_enable_gravatar', True)
9 changes: 6 additions & 3 deletions app/eventyay/common/templates/common/avatar.html
Original file line number Diff line number Diff line change
Expand Up @@ -11,16 +11,19 @@
<div class="avatar-upload hide-label">
{{ form.avatar.as_field_group }}
</div>
{{ form.get_gravatar.as_field_group }}
{% if request.event.cfp.enable_gravatar %}
{{ form.get_gravatar.as_field_group }}
{% endif %}
</div>
<div class="form-image-preview {% if not user.avatar and not user.get_gravatar %}d-none{% endif %}">
<div class="form-image-preview {% if not user.avatar and (not user.get_gravatar or not request.event.cfp.enable_gravatar) %}d-none{% endif %}">
<a href="{% if user.avatar %}{{ user.avatar|thumbnail:"default" }}{% endif %}" data-lightbox="{% if user.avatar %}{{ user.avatar.url }}{% endif %}">
<img loading="lazy"
class="avatar"
data-gravatar="{{ user.gravatar_parameter }}"
data-avatar="{% if user.avatar %}{{ user.avatar.url }}{% endif %}"
alt="{% translate "Your avatar" %}"
{% if user.avatar %}src="{{ user.avatar.url }}"{% endif %} />
{% if user.avatar %}src="{{ user.avatar.url }}"{% endif %}
{% if not user.avatar and user.get_gravatar and request.event.cfp.enable_gravatar %}src="https://www.gravatar.com/avatar/{{ user.gravatar_parameter }}?s=140&d=identicon"{% endif %} />
</a>
</div>
</div>
Expand Down
7 changes: 7 additions & 0 deletions app/eventyay/orga/forms/cfp.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,11 @@ class CfPSettingsForm(ReadOnlyFlag, I18nFormMixin, I18nHelpText, JsonSubfieldMix
widget=forms.RadioSelect(),
required=False,
)
cfp_enable_gravatar = forms.BooleanField(
label=_('Enable Gravatar'),
help_text=_('Allow speakers to use Gravatar for their profile picture.'),
required=False,
)

def __init__(self, *args, obj, **kwargs):
kwargs.pop('read_only') # added in ActionFromUrl view mixin, but not needed here.
Expand All @@ -69,6 +74,7 @@ def __init__(self, *args, obj, **kwargs):
if getattr(obj, 'email', None):
self.fields['mail_on_new_submission'].help_text += f' (<a href="mailto:{obj.email}">{obj.email}</a>)'
self.initial['count_length_in'] = obj.cfp.settings.get('count_length_in', 'chars')
self.initial['cfp_enable_gravatar'] = obj.cfp.enable_gravatar
self.length_fields = [
'title',
'abstract',
Expand Down Expand Up @@ -148,6 +154,7 @@ def __init__(self, *args, obj, **kwargs):

def save(self, *args, **kwargs):
self.instance.cfp.settings['count_length_in'] = self.cleaned_data.get('count_length_in') or 'chars'
self.instance.cfp.settings['cfp_enable_gravatar'] = self.cleaned_data.get('cfp_enable_gravatar', True)
for key in self.request_require_fields:
if key not in self.instance.cfp.fields:
self.instance.cfp.fields[key] = default_fields()[key]
Expand Down
24 changes: 24 additions & 0 deletions app/eventyay/orga/templates/orga/cfp/forms.html
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ <h2 class="d-flex">
<th class="text-center">{% translate "Required" %}</th>
<th>{% translate "Minimum length" %}</th>
<th>{% translate "Maximum length" %}</th>
<th class="text-center">{% translate "Settings" %}</th>
</tr>
</thead>
<tbody>
Expand All @@ -98,6 +99,7 @@ <h2 class="d-flex">
</td>
<td>{{ sform.cfp_title_min_length.as_field_group }}</td>
<td>{{ sform.cfp_title_max_length.as_field_group }}</td>
<td></td>
</tr>

{# Abstract #}
Expand Down Expand Up @@ -127,6 +129,7 @@ <h2 class="d-flex">
</td>
<td>{{ sform.cfp_abstract_min_length.as_field_group }}</td>
<td>{{ sform.cfp_abstract_max_length.as_field_group }}</td>
<td></td>
</tr>
{% endwith %}

Expand Down Expand Up @@ -157,6 +160,7 @@ <h2 class="d-flex">
</td>
<td>{{ sform.cfp_description_min_length.as_field_group }}</td>
<td>{{ sform.cfp_description_max_length.as_field_group }}</td>
<td></td>
</tr>
{% endwith %}

Expand Down Expand Up @@ -187,6 +191,7 @@ <h2 class="d-flex">
</td>
<td></td>
<td></td>
<td></td>
</tr>
{% endwith %}

Expand Down Expand Up @@ -217,6 +222,7 @@ <h2 class="d-flex">
</td>
<td></td>
<td></td>
<td></td>
</tr>
{% endwith %}

Expand Down Expand Up @@ -247,6 +253,7 @@ <h2 class="d-flex">
</td>
<td></td>
<td></td>
<td></td>
</tr>
{% endwith %}

Expand Down Expand Up @@ -279,6 +286,7 @@ <h2 class="d-flex">
</td>
<td></td>
<td></td>
<td></td>
</tr>
{% endif %}
{% endwith %}
Expand Down Expand Up @@ -310,6 +318,7 @@ <h2 class="d-flex">
</td>
<td></td>
<td></td>
<td></td>
</tr>
{% endwith %}

Expand Down Expand Up @@ -340,6 +349,7 @@ <h2 class="d-flex">
</td>
<td></td>
<td></td>
<td></td>
</tr>
{% endwith %}
{% for item in custom_session_fields %}
Expand Down Expand Up @@ -371,6 +381,7 @@ <h2 class="d-flex">
</td>
<td></td>
<td></td>
<td></td>
</tr>
{% endfor %}
</tbody>
Expand Down Expand Up @@ -407,6 +418,7 @@ <h2 class="d-flex">
<th class="text-center">{% translate "Required" %}</th>
<th>{% translate "Minimum length" %}</th>
<th>{% translate "Maximum length" %}</th>
<th class="text-center">{% translate "Settings" %}</th>
</tr>
</thead>
<tbody>
Expand Down Expand Up @@ -437,6 +449,7 @@ <h2 class="d-flex">
</td>
<td>{{ sform.cfp_biography_min_length.as_field_group }}</td>
<td>{{ sform.cfp_biography_max_length.as_field_group }}</td>
<td></td>
</tr>
{% endwith %}

Expand Down Expand Up @@ -467,6 +480,12 @@ <h2 class="d-flex">
</td>
<td></td>
<td></td>
<td class="text-center">
<label class="toggle-switch" aria-label="Toggle Gravatar for Profile picture">
{{ sform.cfp_enable_gravatar }}
<span class="toggle-slider"></span>
</label>
</td>
</tr>
{% endwith %}

Expand Down Expand Up @@ -497,6 +516,7 @@ <h2 class="d-flex">
</td>
<td>{{ sform.cfp_avatar_source_min_length.as_field_group }}</td>
<td>{{ sform.cfp_avatar_source_max_length.as_field_group }}</td>
<td></td>
</tr>
{% endwith %}

Expand Down Expand Up @@ -527,6 +547,7 @@ <h2 class="d-flex">
</td>
<td>{{ sform.cfp_avatar_license_min_length.as_field_group }}</td>
<td>{{ sform.cfp_avatar_license_max_length.as_field_group }}</td>
<td></td>
</tr>
{% endwith %}

Expand Down Expand Up @@ -557,6 +578,7 @@ <h2 class="d-flex">
</td>
<td></td>
<td></td>
<td></td>
</tr>
{% endwith %}

Expand Down Expand Up @@ -587,6 +609,7 @@ <h2 class="d-flex">
</td>
<td></td>
<td></td>
<td></td>
</tr>
{% for item in custom_speaker_fields %}
<tr>
Expand Down Expand Up @@ -617,6 +640,7 @@ <h2 class="d-flex">
</td>
<td></td>
<td></td>
<td></td>
</tr>
{% endfor %}
{% endwith %}
Expand Down
20 changes: 11 additions & 9 deletions app/eventyay/person/forms/profile.py
Original file line number Diff line number Diff line change
Expand Up @@ -110,9 +110,12 @@ def __init__(self, *args, name=None, enforce_account_name_match=False, **kwargs)
self.fields.pop('avatar_source', None)
self.fields.pop('avatar_license', None)
self.fields.pop('get_gravatar', None)
elif 'avatar' in self.fields:
self.fields['avatar'].required = False
self.fields['avatar'].widget.is_required = False
else:
if not self.event.cfp.enable_gravatar:
self.fields.pop('get_gravatar', None)
if 'avatar' in self.fields:
self.fields['avatar'].required = False
self.fields['avatar'].widget.is_required = False
if self.is_bound and not self.is_valid() and 'availabilities' in self.errors:
# Replace self.data with a version that uses initial["availabilities"]
# in order to have event and timezone data available
Expand Down Expand Up @@ -151,12 +154,11 @@ def clean_email(self):
def clean(self):
data = super().clean()
if self.event.cfp.require_avatar and not data.get('avatar') and not data.get('get_gravatar'):
self.add_error(
'avatar',
forms.ValidationError(
_('Please provide a profile picture or allow us to load your picture from gravatar!')
),
)
if self.event.cfp.enable_gravatar:
msg = _('Please provide a profile picture or allow us to load your picture from gravatar!')
else:
msg = _('Please provide a profile picture!')
self.add_error('avatar', forms.ValidationError(msg))
fullname = self.cleaned_data.get('fullname')
if (
self.enforce_account_name_match
Expand Down