예제 #1
0
 def dehydrate_badging(self, bundle):
     return SettingProperties.get_bool(constants.OPPIA_BADGES_ENABLED,
                                       settings.OPPIA_BADGES_ENABLED)
예제 #2
0
    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',
            )
        ])
예제 #3
0
 def dehydrate_scoring(self, bundle):
     return SettingProperties.get_bool(constants.OPPIA_POINTS_ENABLED,
                                       settings.OPPIA_POINTS_ENABLED)
예제 #4
0
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
    }
예제 #5
0
 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)
예제 #6
0
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
예제 #7
0
    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',
            )])
예제 #8
0
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
    }