Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
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
1 change: 1 addition & 0 deletions requirements/prod_20_04.pip
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ MarkupSafe==1.1.1
matplotlib==2.0.2
msgpack==1.0.2
numpy==1.23.1
numpyencoder==0.3.0
odfpy==1.4.0
openapi-codec==1.3.2
openpyxl==3.0.0
Expand Down
33 changes: 8 additions & 25 deletions stats/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,11 @@
import json
import datetime
from django.utils import timezone
from tigascoring.xp_scoring import compute_user_score_in_xp_v2
from rest_framework.exceptions import ParseError
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
import math
from django.utils import translation

from tigascoring.xp_scoring import compute_user_score_in_xp_v2
from rest_framework.exceptions import ParseError
from django.core.paginator import Paginator
import math
Expand Down Expand Up @@ -642,13 +640,8 @@ def stats_user_score(request, user_uuid=None):
pass

if user.score_v2_struct is None:
user_score = compute_user_score_in_xp_v2(user_uuid, update=True)
user.score_v2_struct = json.dumps(user_score, indent=2, sort_keys=True, default=str)
user.last_score_update = datetime.datetime.now()
user.save()
else:
user_score = json.loads(user.score_v2_struct)
context = { "score_data": user_score, "score_last_update": user.last_score_update }
user.update_score(commit=True)
context = { "score_data": user.score_v2_struct, "score_last_update": user.last_score_update }
return render(request, 'stats/user_score.html', context)


Expand Down Expand Up @@ -680,17 +673,11 @@ def stats_user_ranking(request, page=1, user_uuid=None):
try:
user = TigaUser.objects.get(pk=user_uuid)
user.get_identicon()
#user_score = compute_user_score_in_xp_v2(user_uuid, update=True)
if user.score_v2_struct is None:
user_score = compute_user_score_in_xp_v2(user_uuid, update=True)
user.score_v2_struct = json.dumps(user_score, indent=2, sort_keys=True, default=str)
user.last_score_update = datetime.datetime.now()
user.save()
else:
user_score = json.loads( user.score_v2_struct )
if user_score['total_score'] > 0:
user_has_score = True

if user.score_v2_struct is None:
user.update_score(commit=True)
user_score = user.score_v2_struct
user_has_score = bool(user.score_v2)
except TigaUser.DoesNotExist:
pass
seek = request.GET.get('seek', 'f')
Expand Down Expand Up @@ -1046,13 +1033,9 @@ def get_user_xp_data(request):
translation.activate(locale)

if u.score_v2_struct is None:
retval = compute_user_score_in_xp_v2(user_id, update=True)
u.score_v2_struct = json.dumps(retval, indent=2, sort_keys=True, default=str)
u.last_score_update = datetime.datetime.now()
u.save()
else:
retval = json.loads(u.score_v2_struct)
u.update_score(commit=True)

retval = u.score_v2_struct
retval['last_update'] = u.last_score_update

return Response(retval)
Expand Down
134 changes: 10 additions & 124 deletions tigascoring/xp_scoring.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from tigaserver_app.models import Report, TigaUser, TigaProfile, Award
from tigaserver_app.models import Report, TigaUser, Award
from tigaserver_project import settings as conf
import pandas as pd
import datetime
Expand Down Expand Up @@ -324,106 +324,17 @@ def get_unrelated_awards_score( user_uuid, user_uuids ):
# return str(diff.days) + _(" days ago")


def compute_user_score_in_xp_v2_fast(user_uuid):
def compute_user_score_in_xp_v2(user_uuid):

user = TigaUser.objects.get(pk=user_uuid)
user_uuids = None
if user.profile is not None:
user_uuids = TigaUser.objects.filter(profile=user.profile).values('user_UUID')

result = {}
result['total_score'] = 0
result['user_uuid'] = user_uuid
result['score_detail'] = {}

if user_uuids is None:
user_reports = Report.objects.filter(user__user_UUID=user_uuid).order_by('-creation_time')
else:
user_reports = Report.objects.filter(user__user_UUID__in=user_uuids).order_by('-creation_time')

adults = user_reports.filter(type='adult')
#bites = user_reports.filter(type='bite')
sites = user_reports.filter(type='site')

adult_last_versions = adults.non_deleted().all()
#bite_last_versions = bites.non_deleted().all()
site_last_versions = sites.non_deleted().all()

results_adult = {}
results_adult['score'] = 0
results_adult['score_items'] = []
result['score_detail']['adult'] = results_adult

adult_score = 0
for report in adult_last_versions:
result = get_adult_report_score(report, result)
index = len(result['score_detail']['adult']['score_items']) - 1
result['score_detail']['adult']['score'] += result['score_detail']['adult']['score_items'][index][
'report_score']
adult_score += result['score_detail']['adult']['score_items'][index]['report_score']
result['total_score'] += adult_score

'''
results_bite = {}
results_bite['score'] = 0
results_bite['score_items'] = []
result['score_detail']['bite'] = results_bite

bite_score = 0
for report in bite_last_versions:
result = get_bite_report_score(report, result)
index = len(result['score_detail']['bite']['score_items']) - 1
result['score_detail']['bite']['score'] += result['score_detail']['bite']['score_items'][index]['report_score']
bite_score += result['score_detail']['bite']['score_items'][index]['report_score']
result['total_score'] += bite_score
'''

results_site = {}
results_site['score'] = 0
results_site['score_items'] = []
result['score_detail']['site'] = results_site

site_score = 0
for report in site_last_versions:
result = get_site_report_score(report, result)
index = len(result['score_detail']['site']['score_items']) - 1
result['score_detail']['site']['score'] += result['score_detail']['site']['score_items'][index]['report_score']
site_score += result['score_detail']['site']['score_items'][index]['report_score']
result['total_score'] += site_score

unrelated_score = get_unrelated_awards_score(user_uuid, user_uuids)

result['total_score'] += unrelated_score['score']

return result


def get_uuid_replicas():
profiles = TigaProfile.objects.all()
exclude = []
for p in profiles:
if p.profile_devices.count() > 1:
i = 0
for d in p.profile_devices.all().order_by('user_UUID'):
if i > 0:
exclude.append(d.user_UUID)
i+=1
return exclude


def compute_user_score_in_xp_v2(user_uuid, update=False):

user = TigaUser.objects.get(pk=user_uuid)
user_uuids = None
if user.profile is not None:
user_uuids = TigaUser.objects.filter(profile=user.profile).values('user_UUID')

uuid_replicas = get_uuid_replicas()

qs_overall = TigaUser.objects.exclude(score_v2=0).exclude(user_UUID__in=uuid_replicas)
qs_adult = TigaUser.objects.exclude(score_v2_adult=0).exclude(user_UUID__in=uuid_replicas)
qs_site = TigaUser.objects.exclude(score_v2_site=0).exclude(user_UUID__in=uuid_replicas)
#qs_bite = TigaUser.objects.exclude(score_v2_bite=0).exclude(user_UUID__in=uuid_replicas)
qs_overall = TigaUser.objects.exclude(score_v2=0)
qs_adult = TigaUser.objects.exclude(score_v2_adult=0)
qs_site = TigaUser.objects.exclude(score_v2_site=0)
#qs_bite = TigaUser.objects.exclude(score_v2_bite=0)

overall_df = pd.DataFrame(list(qs_overall.values_list('score_v2', 'user_UUID')), columns=['score_v2', 'user_UUID'])
adult_df = pd.DataFrame(list(qs_adult.values_list('score_v2_adult', 'user_UUID')), columns=['score_v2_adult', 'user_UUID'])
Expand Down Expand Up @@ -461,12 +372,7 @@ def compute_user_score_in_xp_v2(user_uuid, update=False):
#rank_value_bite = get_user_rank_value(bite_sorted_df, user_uuid)
#min_max_bite = get_min_max(bite_sorted_df, 'score_v2_bite')

current_date = datetime.date.today()
if user is not None:
result['joined_value'] = user.registration_time.strftime("%d/%m/%Y")
#result['joined_label'] = get_elapsed_label(current_date, user.registration_time.date())
else:
result['joined_value'] = None
result['joined_value'] = user.registration_time.strftime("%d/%m/%Y")

if user_uuids is None:
user_reports = Report.objects.filter(user__user_UUID=user_uuid).order_by('-creation_time')
Expand Down Expand Up @@ -494,7 +400,7 @@ def compute_user_score_in_xp_v2(user_uuid, update=False):
result['score_detail']['adult'] = results_adult

adult_score = 0
for report in adult_last_versions:
for report in adult_last_versions.iterator():
result = get_adult_report_score(report, result)
index = len(result['score_detail']['adult']['score_items']) - 1
result['score_detail']['adult']['score'] += result['score_detail']['adult']['score_items'][index]['report_score']
Expand All @@ -508,7 +414,7 @@ def compute_user_score_in_xp_v2(user_uuid, update=False):

'''
bite_score = 0
for report in bite_last_versions:
for report in bite_last_versions.iterator():
result = get_bite_report_score(report, result)
index = len(result['score_detail']['bite']['score_items']) - 1
result['score_detail']['bite']['score'] += result['score_detail']['bite']['score_items'][index]['report_score']
Expand All @@ -522,7 +428,7 @@ def compute_user_score_in_xp_v2(user_uuid, update=False):
result['score_detail']['site'] = results_site

site_score = 0
for report in site_last_versions:
for report in site_last_versions.iterator():
result = get_site_report_score(report, result)
index = len(result['score_detail']['site']['score_items']) - 1
result['score_detail']['site']['score'] += result['score_detail']['site']['score_items'][index]['report_score']
Expand Down Expand Up @@ -587,18 +493,6 @@ def compute_user_score_in_xp_v2(user_uuid, update=False):
result['score_detail']['site']['top_perc'] = (float(site_number_below_rank) / float(site_number_total)) * 100.0
result['score_detail']['site']['ranked_users'] = site_number_total

if update:
if user_uuids is not None:
all_users_in_profile = TigaUser.objects.filter(user_UUID__in=user_uuids)
all_users_in_profile.update(score_v2=result['total_score'])
all_users_in_profile.update(score_v2_adult=result['score_detail']['adult']['score'])
all_users_in_profile.update(score_v2_site=result['score_detail']['site']['score'])
else:
user.score_v2 = result['total_score']
user.score_v2_adult = result['score_detail']['adult']['score']
user.score_v2_site = result['score_detail']['site']['score']
user.save()

'''
if bite_number_below_rank == 0 and bite_number_total == 0:
result['score_detail']['bite']['top_perc'] = 100.0
Expand All @@ -610,14 +504,6 @@ def compute_user_score_in_xp_v2(user_uuid, update=False):
return result


def compute_all_user_scores():
all_users = TigaUser.objects.all()
for user in all_users:
score = compute_user_score_in_xp_v2( user.user_UUID )
user.score_v2 = score
user.save()


def get_all_user_reports(user_uuid):
user = TigaUser.objects.get(pk=user_uuid)
user_uuids = None
Expand Down
19 changes: 19 additions & 0 deletions tigaserver_app/migrations/0053_tigauser_update_score_jsonfield.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Generated by Django 2.2.7 on 2024-03-15 11:50

import django.contrib.postgres.fields.jsonb
from django.db import migrations
import numpyencoder.numpyencoder

class Migration(migrations.Migration):

dependencies = [
('tigaserver_app', '0052_ensure_masked_fixes'),
]

operations = [
migrations.AlterField(
model_name='tigauser',
name='score_v2_struct',
field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, encoder=numpyencoder.numpyencoder.NumpyEncoder, help_text='Full cached score data', null=True),
),
]
Loading
Loading