def dehydrate_badging(self, bundle): return SettingProperties.get_bool(constants.OPPIA_BADGES_ENABLED, settings.OPPIA_BADGES_ENABLED)
def __init__(self, allow_edit=True, *args, **kwargs): super(ProfileForm, self).__init__(*args, **kwargs) userdata = kwargs.get('initial') \ if 'initial' in kwargs else kwargs.get('data') email = userdata.get('email', None) username = userdata.get('username', None) helpers.custom_fields(self) self.helper = FormHelper() self.helper.form_class = 'form-horizontal' self.helper.label_class = 'col-lg-2 col-md-3 col-sm-4' self.helper.field_class = 'col-lg-5 col-md-7 col-sm-8' self.helper.layout = Layout() if SettingProperties.get_bool(constants.OPPIA_SHOW_GRAVATARS, settings.OPPIA_SHOW_GRAVATARS): gravatar_url = "https://www.gravatar.com/avatar.php?" gravatar_id = hashlib.md5(str(email).encode('utf-8')).hexdigest() gravatar_url += urllib.parse.urlencode({ 'gravatar_id': gravatar_id, 'size': 64 }) self.helper.layout.append( Div( HTML("""<label class="control-label col-lg-2">""" + _(u'Photo') + """</label>"""), Div( HTML( mark_safe('<img src="{0}" alt="gravatar for {1}" \ class="gravatar" width="{2}" height="{2}"/>'. format(gravatar_url, username, 64))), HTML("""<br/>"""), HTML("""<a href="https://www.gravatar.com">""" + _(u'Update gravatar') + """</a>"""), css_class="col-lg-4", ), css_class="form-group", )) if not allow_edit: # Set fields as read-only if the user is not allow to edit their # profile for key, field in self.fields.items(): if not key.startswith('password'): field.widget.attrs.update({'readonly': 'readonly'}) self.helper.layout.extend([ 'api_key', 'username', 'email', 'first_name', 'last_name', 'job_title', 'organisation', 'phone_number' ]) custom_fields = CustomField.objects.all().order_by('order') for custom_field in custom_fields: self.helper.layout.append(custom_field.id) self.helper.layout.extend([ Div( HTML("""<h4 class='mt-5 mb-3'>""" + _(u'Change password') + """</h4>"""), ), Div(HTML("""<div style='clear:both'></div>""")), 'password', 'password_again', Div( Submit('submit', _(u'Save Profile'), css_class='btn btn-default mt-3'), css_class='text-center col-lg-offset-2 col-lg-6', ) ])
def dehydrate_scoring(self, bundle): return SettingProperties.get_bool(constants.OPPIA_POINTS_ENABLED, settings.OPPIA_POINTS_ENABLED)
def get_settings(request): self_register = SettingProperties.get_bool( constants.OPPIA_ALLOW_SELF_REGISTRATION, settings.OPPIA_ALLOW_SELF_REGISTRATION) show_gravatars = SettingProperties.get_bool(constants.OPPIA_SHOW_GRAVATARS, settings.OPPIA_SHOW_GRAVATARS) ga_enabled = SettingProperties.get_bool( constants.OPPIA_GOOGLE_ANALYTICS_ENABLED, settings.OPPIA_GOOGLE_ANALYTICS_ENABLED) ga_code = SettingProperties.get_string( constants.OPPIA_GOOGLE_ANALYTICS_CODE, settings.OPPIA_GOOGLE_ANALYTICS_CODE) ga_domain = SettingProperties.get_string( constants.OPPIA_GOOGLE_ANALYTICS_DOMAIN, settings.OPPIA_GOOGLE_ANALYTICS_DOMAIN) try: badge_award_method = BadgeMethod.objects.get( badge__ref="coursecompleted") badge_award_method_percent = SettingProperties.get_int( constants.OPPIA_BADGES_PERCENT_COMPLETED, 100) except BadgeMethod.DoesNotExist: badge_award_method = "undefined" badge_award_method_percent = 100 cron_warning = False last_cron = SettingProperties.get_string(constants.OPPIA_CRON_LAST_RUN, None) last_summary_cron = SettingProperties.get_string( constants.OPPIA_SUMMARY_CRON_LAST_RUN, None) TIME_ZONE_FIX = '+00:00' # fix for bad timezone dates if last_cron and TIME_ZONE_FIX not in last_cron: last_cron += TIME_ZONE_FIX if last_summary_cron and TIME_ZONE_FIX not in last_summary_cron: last_summary_cron += TIME_ZONE_FIX if last_cron is None or last_summary_cron is None: cron_warning = True else: start_date = datetime.datetime.now() - datetime.timedelta(days=7) last_cron_date = datetime.datetime.strptime( last_cron, constants.CRON_DATETIME_FORMAT) if last_cron_date < start_date: cron_warning = True last_summary_cron_date = datetime.datetime.strptime( last_summary_cron, constants.CRON_DATETIME_FORMAT) if last_summary_cron_date < start_date: cron_warning = True return { 'OPPIA_ALLOW_SELF_REGISTRATION': self_register, 'OPPIA_GOOGLE_ANALYTICS_ENABLED': ga_enabled, 'OPPIA_GOOGLE_ANALYTICS_CODE': ga_code, 'OPPIA_GOOGLE_ANALYTICS_DOMAIN': ga_domain, 'OPPIA_SHOW_GRAVATARS': show_gravatars, 'OPPIA_REPORTS': menu_reports(request), 'DEBUG': settings.DEBUG, 'CRON_WARNING': cron_warning, 'COURSE_COMPLETE_BADGE_CRITERIA': badge_award_method, 'COURSE_COMPLETE_BADGE_CRITERIA_PERCENT': badge_award_method_percent }
def dispatch(self, *args, **kwargs): self_register = SettingProperties.get_bool(constants.OPPIA_ALLOW_SELF_REGISTRATION, settings.OPPIA_ALLOW_SELF_REGISTRATION) if not self_register: raise Http404 else: return super().dispatch(*args, **kwargs)
def menu_reports(request): # add in here any reports that need to appear reports = [{ 'name': _(u'User Registrations'), 'description': _(u'Number of user registrations'), 'url': reverse('reports:user_registrations'), 'icon': 'timeline' }, { 'name': _(u'Course downloads'), 'description': _(u'Number of course downloads'), 'url': reverse('reports:course_downloads'), 'icon': 'timeline' }, { 'name': _(u'Course activity'), 'description': _(u'Course activity'), 'url': reverse('reports:course_activity'), 'icon': 'timeline' }, { 'name': _(u'Completion Rates'), 'description': _(u'Completion rates for each course'), 'url': reverse('reports:completion_rates'), 'icon': 'vertical_split' }, { 'name': _(u'Unique Users'), 'description': _(u'Number of unique users, grouped by \ registration fields'), 'url': reverse('reports:unique_users'), 'icon': 'vertical_split' }, { 'name': _(u'Daily Active users'), 'description': _(u'Number of unique daily users'), 'url': reverse('reports:daus'), 'icon': 'timeline' }, { 'name': _(u'Monthly Active users'), 'description': _(u'Number of unique monthly users'), 'url': reverse('reports:maus'), 'icon': 'timeline' }, { 'name': _(u'Total time spent'), 'description': _(u'Total time spent on activities'), 'url': reverse('reports:totaltimespent'), 'icon': 'timeline' }, { 'name': _(u'Average time spent'), 'description': _(u'Average time spent by each user'), 'url': reverse('reports:averagetimespent'), 'icon': 'timeline' }, { 'name': _(u'Time spent by user and course'), 'description': _(u'Download daily time spent by user and \ course'), 'url': reverse('reports:user-course-time-spent'), 'icon': 'save_alt' }, { 'name': _(u'Searches'), 'description': _(u'In-app searches'), 'url': reverse('reports:searches'), 'icon': 'timeline' }, { 'name': _(u'Search terms'), 'description': _(u'Search terms used'), 'url': reverse('reports:search_terms'), 'icon': 'vertical_split' }, { 'name': _(u'Activity by Language'), 'description': _(u'Activity by language'), 'url': reverse('reports:lang_activity'), 'icon': 'pie_chart' }, { 'name': _(u'Inactive Users'), 'description': _(u'Users who have not been active'), 'url': reverse('reports:inactive_users'), 'icon': 'vertical_split' }, { 'name': _(u'Missing Media'), 'description': _(u'Users who have media missing on their \ devices'), 'url': reverse('reports:missing_media'), 'icon': 'vertical_split' }] map_viz_enabled = SettingProperties.get_bool( constants.OPPIA_MAP_VISUALISATION_ENABLED, False) if map_viz_enabled: reports.append({ 'name': _(u'Activity Map'), 'description': _(u'Map of users locations'), 'url': reverse('reports:map'), 'icon': 'map' }) reports.append({ 'name': _(u'Countries'), 'description': _(u'Countries users are accessing from'), 'url': reverse('reports:countries'), 'icon': 'pie_chart' }) return reports
def __init__(self, *args, **kwargs): super(ProfileForm, self).__init__(* args, ** kwargs) if len(args) == 1: email = args[0]['email'] username = args[0]['username'] else: kw = kwargs.pop('initial') email = kw['email'] username = kw['username'] helpers.custom_fields(self) self.helper = FormHelper() self.helper.form_class = 'form-horizontal' self.helper.label_class = 'col-lg-2 col-md-3 col-sm-4' self.helper.field_class = 'col-lg-5 col-md-7 col-sm-8' self.helper.layout = Layout() if SettingProperties.get_bool( constants.OPPIA_SHOW_GRAVATARS, settings.OPPIA_SHOW_GRAVATARS): gravatar_url = "https://www.gravatar.com/avatar.php?" gravatar_id = hashlib.md5(str(email).encode('utf-8')).hexdigest() gravatar_url += urllib.parse.urlencode({ 'gravatar_id': gravatar_id, 'size': 64 }) self.helper.layout.append( Div( HTML("""<label class="control-label col-lg-2">""" + _(u'Photo') + """</label>"""), Div( HTML(mark_safe( '<img src="{0}" alt="gravatar for {1}" \ class="gravatar" width="{2}" height="{2}"/>' .format(gravatar_url, username, 64))), HTML("""<br/>"""), HTML("""<a href="https://www.gravatar.com">""" + _(u'Update gravatar') + """</a>"""), css_class="col-lg-4", ), css_class="form-group", ) ) self.helper.layout.extend( ['api_key', 'username', 'email', 'first_name', 'last_name', 'job_title', 'organisation']) custom_fields = CustomField.objects.all().order_by('order') for custom_field in custom_fields: self.helper.layout.append(custom_field.id) self.helper.layout.extend([ Div( HTML("""<h4 class='mt-5 mb-3'>""" + _(u'Change password') + """</h4>"""), ), Div(HTML("""<div style='clear:both'></div>""")), 'password', 'password_again', Div( Submit('submit', _(u'Save Profile'), css_class='btn btn-default mt-3'), css_class='text-center col-lg-offset-2 col-lg-6', )])
def get_settings(request): self_register = SettingProperties.get_bool( constants.OPPIA_ALLOW_SELF_REGISTRATION, settings.OPPIA_ALLOW_SELF_REGISTRATION) show_gravatars = SettingProperties.get_bool(constants.OPPIA_SHOW_GRAVATARS, settings.OPPIA_SHOW_GRAVATARS) ga_enabled = SettingProperties.get_bool( constants.OPPIA_GOOGLE_ANALYTICS_ENABLED, settings.OPPIA_GOOGLE_ANALYTICS_ENABLED) ga_code = SettingProperties.get_string( constants.OPPIA_GOOGLE_ANALYTICS_CODE, settings.OPPIA_GOOGLE_ANALYTICS_CODE) ga_domain = SettingProperties.get_string( constants.OPPIA_GOOGLE_ANALYTICS_DOMAIN, settings.OPPIA_GOOGLE_ANALYTICS_DOMAIN) map_viz_enabled = SettingProperties.get_bool( constants.OPPIA_MAP_VISUALISATION_ENABLED, False) cron_warning = False last_cron = SettingProperties.get_string(constants.OPPIA_CRON_LAST_RUN, None) last_summary_cron = SettingProperties.get_string( constants.OPPIA_SUMMARY_CRON_LAST_RUN, None) TIME_ZONE_FIX = '+00:00' # fix for bad timezone dates if last_cron and TIME_ZONE_FIX not in last_cron: last_cron += TIME_ZONE_FIX if last_summary_cron and TIME_ZONE_FIX not in last_summary_cron: last_summary_cron += TIME_ZONE_FIX if last_cron is None or last_summary_cron is None: cron_warning = True else: start_date = datetime.datetime.now() - datetime.timedelta(days=7) last_cron_date = datetime.datetime.strptime( last_cron, constants.CRON_DATETIME_FORMAT) if last_cron_date < start_date: cron_warning = True last_summary_cron_date = datetime.datetime.strptime( last_summary_cron, constants.CRON_DATETIME_FORMAT) if last_summary_cron_date < start_date: cron_warning = True return { 'OPPIA_ALLOW_SELF_REGISTRATION': self_register, 'OPPIA_GOOGLE_ANALYTICS_ENABLED': ga_enabled, 'OPPIA_GOOGLE_ANALYTICS_CODE': ga_code, 'OPPIA_GOOGLE_ANALYTICS_DOMAIN': ga_domain, 'OPPIA_SHOW_GRAVATARS': show_gravatars, 'OPPIA_REPORTS': menu_reports(request), 'DEBUG': settings.DEBUG, 'CRON_WARNING': cron_warning, 'OPPIA_MAP_VISUALISATION_ENABLED': map_viz_enabled }