예제 #1
0
def analytics_heatmaps_delete(idsitehsr):
    idsite = request.args['idSite']
    form_class = HeatmapsDeleteForm

    matomo_user = get_matomo_user()
    heatmap = HeatmapSessionRecordingManager().getHeatmap(
        matomo_user.token_auth, idsite, idsitehsr)

    if request.method == 'POST':
        form = form_class(formdata=request.form)
        if form.validate_on_submit():
            name = form.data['name'].strip()

            if heatmap['name'].strip() == name:
                try:
                    HeatmapSessionRecordingManager().deleteHeatmap(
                        matomo_user.token_auth, idsite, idsitehsr)
                except MatomoError as e:
                    flash(str(e), 'negative')
                else:
                    flash(f"Heatmap '{heatmap['name']}' was deleted")
                    return redirect(
                        url_for('analytics_heatmaps', idSite=idsite))
            else:
                flash('Name does not match', 'negative')

    form = form_class()

    return render_template('analytics/heatmaps_delete.html',
                           title='Behavee > Analytics > Delete Heatmap',
                           heatmaps_delete_form=form,
                           menuHeatmapsList="active",
                           idsite=idsite,
                           idsitehsr=idsitehsr,
                           heatmap=heatmap)
예제 #2
0
def analytics_session_recordings():

    matomo_user = get_matomo_user()

    try:
        idsite = request.args['idSite']
    except KeyError:
        abort(404)  # Fail safe to @site_required

    idsitehsr = request.args.get('idSiteHsr')
    if idsitehsr:
        recording = HeatmapSessionRecordingManager().getSessionRecording(
            matomo_user.token_auth, idsite, idsitehsr)
    else:
        recordings_list = HeatmapSessionRecordingManager(
        ).getSessionRecordings(matomo_user.token_auth, idsite)
        return render_template(
            'analytics/session_recordings_list.html',
            title='Behavee > Analytics > Session Recordings',
            recordings_list=recordings_list,
            idsite=idsite,
            menuSessionRecordingsList="active")

    return render_template('analytics/session_recordings.html',
                           title='Behavee > Analytics > Session Recordings',
                           menuSessionRecordingsList="active",
                           recording=recording,
                           labels={
                               'attribute': dict(constants.RULES),
                               'type': dict(constants.RULES_TYPE)
                           })
예제 #3
0
def analytics_sites():
    d = {}
    site = None
    user = User.query.filter_by(email=current_user.email).first()
    d['current_login_at'] = user.current_login_at.strftime("%Y-%m-%d %H:%M:%S")
    d['last_login_at'] = user.last_login_at.strftime("%Y-%m-%d %H:%M:%S")

    matomo_user = get_matomo_user()

    idsite = request.args.get('idSite')
    if idsite:
        site = SitesManager().getSiteFromId(matomo_user.token_auth, idsite)
    else:
        site_list = SitesManager().getMatomoSites(matomo_user.token_auth)
        if len(site_list) == 1:
            return redirect(url_for('analytics_sites', idSite=site_list[0]['idsite']), 303)
        else:
            return render_template('analytics/sites_list.html', title='Behavee > Analytics > Site List',
                                   user=user, site_list=site_list, d=d, app=app, menuWebsitesList="active")

    if not site:
        abort(404)

    return render_template('analytics/sites.html', title='Behavee > Analytics > Site',
                           user=user, site=site, d=d, app=app, menuWebsitesList="active")
예제 #4
0
def analytics_sites_delete(idsite):
    form_class = SiteDeleteForm

    matomo_user = get_matomo_user()
    site = SitesManager().getSiteFromId(matomo_user.token_auth, idsite)

    if request.method == 'POST':
        form = form_class(formdata=request.form)
        if form.validate_on_submit():
            name = form.data['name'].strip()

            if site['name'] == name:
                try:
                    SitesManager().deleteSite(matomo_user.token_auth, idsite)
                    flask.session['matomo_sites'] = SitesManager().getMatomoSites(app.config['MATOMO_ADMIN_TOKEN'])
                except MatomoError as e:
                    flash(str(e), 'negative')
                else:
                    flash(f"Site '{site['name']}' was deleted")
                    return redirect(url_for('analytics_sites'))
            else:
                flash('Name does not match', 'negative')

    form = form_class()

    return render_template('analytics/site_delete.html',
                           title='Behavee > Analytics > Delete Site',
                           site_delete_form=form, menuWebsitesListList="active", idsite=idsite, site=site)
예제 #5
0
    def wrapper(*args, **kwargs):
        if not request.args.get('idSite', '').strip():
            user = get_matomo_user()
            if user:
                sites = SitesManager().getMatomoSites(user.token_auth)
                return render_template('sites_picker.html',
                                       next_url=SitePickerUrlBuilder(),
                                       site_list=sites)

        return func(*args, **kwargs)
예제 #6
0
def analytics_session_recordings_add():
    form = None
    form_class = SessionRecordingForm

    idsite = request.args['idSite']

    matomo_user = get_matomo_user()
    count_rules = 1

    if request.method == 'POST':
        try:
            count_rules = int(request.form['count_rules'])
        except KeyError:
            logging.warning(f'No count_rules specified: {repr(request.form)}')
        else:
            form = form_class.with_rules(count_rules, formdata=request.form)

            if form.validate_on_submit():
                data = dict(form.data)
                data['idsite'] = idsite

                _rules_update_formdata(data)

                try:
                    r = HeatmapSessionRecordingManager().addSessionRecording(
                        matomo_user.token_auth, **data)
                except MatomoError as e:
                    flash(str(e), 'negative')
                    print('ERRORS', str(e))
                else:
                    if 'value' in r:
                        # return redirect(f"/analytics/heatmaps?idSiteHsr={r['value']}")
                        return redirect(
                            url_for('analytics_session_recordings',
                                    idSite=idsite,
                                    idSiteHsr=r['value']))

                return redirect(
                    url_for('analytics_session_recordings', idSite=idsite))

            else:
                print('FORM ERRORS', form.errors)

    if form is None:
        form = form_class.with_rules(count_rules)

    return render_template('analytics/session_recordings_add.html',
                           title='Behavee > Analytics > Add Session Recording',
                           recording_add_form=form,
                           menuSessionRecordingsAdd="active",
                           count_rules=count_rules,
                           idsite=idsite)
예제 #7
0
def analytics_heatmaps_show(idsitehsr):
    idsite = request.args['idSite']
    matomo_user = get_matomo_user()

    # try:
    #     heatmap = HeatmapSessionRecordingManager().getHeatmap(matomo_user.token_auth, idsite, idsitehsr)
    # except MatomoError:
    #     # TODO log error
    #     abort(404)

    return render_template('analytics/heatmaps_show.html',
                           title='Behavee > Analytics > Show Heatmap',
                           app=app,
                           menuHeatmapsList="active",
                           idsite=idsite,
                           idsitehsr=idsitehsr)
예제 #8
0
def current_site_processor():
    context = {'current_site': None}

    idsite = request.args.get('idSite')
    if idsite:
        user = get_matomo_user()
        if user:
            site = SitesManager().getSiteFromId(user.token_auth, idsite)

            args = dict(request.args)
            args.pop('idSite')
            args.update(request.view_args)
            site['picker_url'] = url_for(request.endpoint, **args)
            context['current_site'] = site

    return context
예제 #9
0
def analytics_session_recordings_show(idsitehsr):
    form = None
    form_class = SessionRecordingForm

    idsite = request.args['idSite']
    matomo_user = get_matomo_user()

    if form is None:
        try:
            recording = HeatmapSessionRecordingManager().getSessionRecording(
                matomo_user.token_auth, idsite, idsitehsr)
        except MatomoError:
            # TODO log error
            abort(404)

        count_rules = len(recording['match_page_rules'])

        for i, rule in enumerate(recording.pop('match_page_rules')):
            type_ = rule['type']
            if int(rule['inverted']):
                type_ = f'not_{type_}'

            recording[f'rules_type_{i}'] = type_
            recording[f'rules_attribute_{i}'] = rule['attribute']
            recording[f'rules_value_{i}'] = rule['value']
            try:
                recording[f'rules_value2_{i}'] = rule['value2']
            except KeyError:
                # We where not supplied with `value2`
                pass

        form = form_class.with_rules(count_rules, **recording)

    return render_template(
        'analytics/session_recordings_show.html',
        title='Behavee > Analytics > Show Session Recording',
        app=app,
        recording_edit_form=form,
        menuSessionRecordingsList="active",
        idsite=idsite,
        idsitehsr=idsitehsr,
        count_rules=count_rules)
예제 #10
0
def reports_visits():
    d = {}
    user = User.query.filter_by(email=current_user.email).first()
    d['current_login_at'] = user.current_login_at.strftime("%Y-%m-%d %H:%M:%S")
    d['last_login_at'] = user.last_login_at.strftime("%Y-%m-%d %H:%M:%S")

    matomo_user = get_matomo_user()

    site = SitesManager().getSiteFromId(matomo_user.token_auth,
                                        request.args.get('idSite'))
    if not site:
        abort(404)

    return render_template('reports/visits.html',
                           title='Behavee > Reports > Visits',
                           user=user,
                           site=site,
                           d=d,
                           app=app,
                           mReportsVisits="active")
예제 #11
0
def analytics_sites_add():
    matomo_user = get_matomo_user()
    package_templates = PackageManager.list_templates(None)

    form = None
    form_class = partial(WebsiteForm.with_packages, [(p.id, p.name,) for p in package_templates])

    if request.method == 'POST':
        form = form_class(**request.form)
        if form.validate():
            data = form.data

            data['start_date'] = datetime.today().strftime('%Y-%m-%d %H:%M:%S')
            data['type_'] = 'website'
            data['user_login'] = matomo_user.login

            package_template_id = data.pop('package')

            try:
                r = SitesManager().addSite(app.config['MATOMO_ADMIN_TOKEN'], **data)
                flask.session['matomo_sites'] = SitesManager().getMatomoSites(app.config['MATOMO_ADMIN_TOKEN'])
            except MatomoError as e:
                flash(str(e), 'negative')
                return redirect('analytics/site')
            else:
                if 'value' in r:
                    PackageManager.add(r['value'], package_templates[package_template_id])
                    return redirect(f"/analytics/sites?idSite={r['value']}")

                # TODO add logging.warning

            return redirect('/analytics/sites')

    if form is None:
        form = form_class(
            sitesearch='1', ecommerce='1', website_currency='CZK', website_timezone='Europe/Prague'
        )

    return render_template('analytics/site_add.html',
                           title='Behavee > Analytics > Add Site', site_add_form=form, menuWebsitesAdd="active")
예제 #12
0
def analytics_ecommerce(action):
    d = {}
    user = User.query.filter_by(email=current_user.email).first()
    d['current_login_at'] = user.current_login_at.strftime("%Y-%m-%d %H:%M:%S")
    d['last_login_at'] = user.last_login_at.strftime("%Y-%m-%d %H:%M:%S")

    matomo_user = get_matomo_user()

    request_period = request.args.get('period', 'month')
    request_date = request.args.get('date', str(date.today()))
    if request_period == 'week':
        request_date = request_date.split(',')
        request_date = request_date[0]
    return render_template('analytics/ecommerce.html',
                           title='Behavee > Analytics > Ecommerce',
                           user=user,
                           pageAction=action,
                           d=d,
                           app=app,
                           menuAnalyticsEcommerce="active",
                           request_period=request_period,
                           request_date=request_date)
예제 #13
0
def analytics_sites_edit(idsite):
    matomo_user = get_matomo_user()
    package_templates = PackageManager.list_templates(None)

    form = None
    form_class = partial(WebsiteForm.with_packages, [(p.id, p.name) for p in package_templates])

    site = SitesManager().getSiteFromId(matomo_user.token_auth, idsite)
    if not site:
        abort(404)

    if request.method == 'POST':
        form = form_class(**request.form)
        if form.validate():
            data = form.data
            package_template_id = data.pop('package')

            try:
                SitesManager().updateSite(matomo_user.token_auth, idsite, **data)
                flask.session['matomo_sites'] = SitesManager().getMatomoSites(app.config['MATOMO_ADMIN_TOKEN'])
            except MatomoError as e:
                # TODO log Matomo error
                flash(str(e), 'negative')
                pass
            else:
                PackageManager.update(idsite, package_templates[package_template_id])
                return redirect(f"/analytics/sites?idSite={idsite}")

            flash('There was an error updating your site. Please try again later', 'error')

    if form is None:
        form = form_class(**site)

    return render_template(
        'analytics/site_edit.html', title='Behavee > Analytics > Edit Site',
        site_edit_form=form, menuWebsitesList="active", idSite=site['idsite']
    )
예제 #14
0
def analytics_session_recordings_edit(idsitehsr):
    form = None
    form_class = SessionRecordingForm

    idsite = request.args['idSite']
    matomo_user = get_matomo_user()

    if request.method == 'POST':
        try:
            count_rules = int(request.form['count_rules'])
        except KeyError:
            # TODO handle exception
            logging.warning(f'No count_rules specified: {repr(request.form)}')
        else:
            form = form_class.with_rules(count_rules, formdata=request.form)
            if form.validate_on_submit():
                data = dict(form.data)
                data['idsite'] = idsite
                data['idsitehsr'] = idsitehsr

                _rules_update_formdata(data)
                try:
                    HeatmapSessionRecordingManager().updateSessionRecording(
                        matomo_user.token_auth, **data)
                except MatomoError as e:
                    flash(str(e), 'negative')
                    print('ERROR', e.response)
                else:
                    print('what')
                    return redirect(
                        url_for('analytics_session_recordings',
                                idSite=idsite,
                                idSiteHsr=idsitehsr), 303)
            else:
                print('FORM_ERRORS', form.errors)

    if form is None:
        try:
            recording = HeatmapSessionRecordingManager().getSessionRecording(
                matomo_user.token_auth, idsite, idsitehsr)
        except MatomoError:
            # TODO log error
            abort(404)

        count_rules = len(recording['match_page_rules'])

        for i, rule in enumerate(recording.pop('match_page_rules')):
            type_ = rule['type']
            if int(rule['inverted']):
                type_ = f'not_{type_}'

            recording[f'rules_type_{i}'] = type_
            recording[f'rules_attribute_{i}'] = rule['attribute']
            recording[f'rules_value_{i}'] = rule['value']
            try:
                recording[f'rules_value2_{i}'] = rule['value2']
            except KeyError:
                # We where not supplied with `value2`
                pass

        form = form_class.with_rules(count_rules, **recording)

    return render_template(
        'analytics/session_recordings_edit.html',
        title='Behavee > Analytics > Edit Session Recording',
        recording_edit_form=form,
        menuSessionRecordingsList="active",
        idsite=idsite,
        idsitehsr=idsitehsr,
        count_rules=count_rules)