Skip to content

Commit

Permalink
Merge pull request #95 from jeffreykirchner/dev
Browse files Browse the repository at this point in the history
summary dev
  • Loading branch information
jeffreykirchner authored Sep 8, 2023
2 parents ed6ce0b + 2eefb27 commit e28b87c
Show file tree
Hide file tree
Showing 7 changed files with 136 additions and 68 deletions.
2 changes: 1 addition & 1 deletion main/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -211,7 +211,7 @@ class SessionPeriodAdmin(admin.ModelAdmin):

readonly_fields=['session','period_number']
list_display = ['session', 'period_number']
fields = ['session','period_number', 'production_completed', 'consumption_completed', 'timer_actions']
fields = ['session','period_number', 'production_completed', 'consumption_completed', 'timer_actions','summary_data']

class SessionPeriodInline(admin.TabularInline):

Expand Down
24 changes: 14 additions & 10 deletions main/consumers/staff/session_consumer_mixins/subject_updates.py
Original file line number Diff line number Diff line change
Expand Up @@ -976,12 +976,12 @@ def sync_move_fruit_to_avatar(session_id, player_id, target_player_id, good_one_

with transaction.atomic():
session = Session.objects.select_for_update().get(id=session_id)
current_period_id = str(session.get_current_session_period().id)
current_period = session.get_current_session_period()

parameter_set = session.parameter_set.json()
parameter_set_player_id = str(session.world_state['avatars'][str(player_id)]['parameter_set_player_id'])

summary_data = session.summary_data[current_period_id][str(player_id)]
summary_data = current_period.summary_data[str(player_id)]

good_one = parameter_set['parameter_set_players'][parameter_set_player_id]['good_one']
good_two = parameter_set['parameter_set_players'][parameter_set_player_id]['good_two']
Expand Down Expand Up @@ -1014,6 +1014,7 @@ def sync_move_fruit_to_avatar(session_id, player_id, target_player_id, good_one_
summary_data["send_avatar_to_avatar_" + target_player_id + "_good_" + good_three] += good_three_move

session.save()
current_period.save()

world_state = session.world_state

Expand All @@ -1029,9 +1030,9 @@ def sync_move_fruit_to_house(session_id, player_id, target_house_id, good_one_mo

with transaction.atomic():
session = Session.objects.select_for_update().get(id=session_id)
current_period_id = str(session.get_current_session_period().id)
current_period = session.get_current_session_period()
world_state = session.world_state
summary_data = session.summary_data[current_period_id][str(player_id)]
summary_data = current_period.summary_data[str(player_id)]

parameter_set = session.parameter_set.json()
parameter_set_player_id = str(world_state['avatars'][str(player_id)]['parameter_set_player_id'])
Expand Down Expand Up @@ -1109,6 +1110,7 @@ def sync_move_fruit_to_house(session_id, player_id, target_house_id, good_one_mo
house["health_value"] = convert_goods_to_health(house[good_one], house[good_two], house[good_three], parameter_set)

session.save()
current_period.save()

world_state = session.world_state

Expand All @@ -1125,7 +1127,7 @@ def sync_attack_avatar(session_id, player_id, target_house_id):

with transaction.atomic():
session = Session.objects.select_for_update().get(id=session_id)
session_period_id = str(session.get_current_session_period().id)
current_period = session.get_current_session_period()
parameter_set = session.parameter_set.json()

player_id_s = str(player_id)
Expand All @@ -1144,9 +1146,9 @@ def sync_attack_avatar(session_id, player_id, target_house_id):

if status == "success":
#data for summary
summary_data = session.summary_data[session_period_id]
summary_data_source = summary_data[player_id_s]
summary_data_target = summary_data[target_house_id_s]

summary_data_source = current_period.summary_data[player_id_s]
summary_data_target = current_period.summary_data[target_house_id_s]

attack_cost = Decimal(parameter_set["attack_cost"])
attack_damage = Decimal(parameter_set["attack_damage"])
Expand Down Expand Up @@ -1175,6 +1177,7 @@ def sync_attack_avatar(session_id, player_id, target_house_id):
target_player["health"] = str(target_player["health"])

session.save()
current_period.save()

world_state = session.world_state
session.save()
Expand Down Expand Up @@ -1225,7 +1228,7 @@ def sync_grove_harvest(session_id, player_id, grove_id):

with transaction.atomic():
session = Session.objects.select_for_update().get(id=session_id)
session_period_id = str(session.get_current_session_period().id)
current_period = session.get_current_session_period()
parameter_set = session.parameter_set.json()

player_id_s = str(player_id)
Expand Down Expand Up @@ -1255,7 +1258,7 @@ def sync_grove_harvest(session_id, player_id, grove_id):
error_message.append({"id":"grove_harvest", "message": "No harvests remaining this period."})

if status == "success":
summary_data = session.summary_data[session_period_id][player_id_s]
summary_data = current_period.summary_data[player_id_s]

player[grove["good"]] += harvest_amount
player["period_grove_harvests"] += 1
Expand All @@ -1265,6 +1268,7 @@ def sync_grove_harvest(session_id, player_id, grove_id):
summary_data["harvest_total_" + grove["good"]] += harvest_amount

session.save()
current_period.save()

world_state = session.world_state

Expand Down
15 changes: 9 additions & 6 deletions main/consumers/staff/session_consumer_mixins/timer.py
Original file line number Diff line number Diff line change
Expand Up @@ -195,14 +195,14 @@ def sync_continue_timer(event, session_id):

with transaction.atomic():
session = Session.objects.select_for_update().get(id=session_id)
current_period = session.get_current_session_period()
parameter_set = session.parameter_set.json()

#check session over
if session.world_state["current_period"] >= parameter_set["period_count"] and \
session.world_state["time_remaining"] <= 1:

world_state = session.world_state
summary_data = session.summary_data

world_state["current_period"] = parameter_set["period_count"]
world_state["time_remaining"] = 0
Expand All @@ -212,7 +212,7 @@ def sync_continue_timer(event, session_id):

#store data
for i in world_state["avatars"]:
sd_player = summary_data[str(current_period_id)][i]
sd_player = current_period.summary_data[i]
sd_player["end_health"] = world_state["avatars"][i]["health"]

avatar = world_state["avatars"][i]
Expand All @@ -222,6 +222,7 @@ def sync_continue_timer(event, session_id):
sd_player["avatar_" + k[0]] = avatar[k[0]]

session.save()
current_period.save()

session = session.get_current_session_period().do_consumption()
session.world_state["current_experiment_phase"] = ExperimentPhase.NAMES
Expand Down Expand Up @@ -274,13 +275,14 @@ def sync_continue_timer(event, session_id):

#check if period over
if period_is_over:
summary_data = session.summary_data

world_state = session.world_state
current_period_id = session.get_current_session_period().id
last_period = session.session_periods.get(id=last_period_id)
summary_data = last_period.summary_data

#store data
for i in world_state["avatars"]:
sd_player = summary_data[str(last_period_id)][i]
sd_player = summary_data[i]

#health
sd_player["end_health"] = world_state["avatars"][i]["health"]
Expand All @@ -292,8 +294,9 @@ def sync_continue_timer(event, session_id):
sd_player["house_" + k[0]] = world_state["houses"][str(avatar["parameter_set_player_id"])][k[0]]
sd_player["avatar_" + k[0]] = avatar[k[0]]

last_period.save()

session = session.session_periods.get(id=last_period_id).do_consumption()
session = last_period.do_consumption()
session = session.get_current_session_period().do_timer_actions(time_remaining)
session = session.get_current_session_period().do_production()
session = session.get_current_session_period().do_grove_growth()
Expand Down
19 changes: 19 additions & 0 deletions main/migrations/0095_sessionperiod_summary_data.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Generated by Django 4.2.3 on 2023-09-08 15:43

import django.core.serializers.json
from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('main', '0094_session_summary_data'),
]

operations = [
migrations.AddField(
model_name='sessionperiod',
name='summary_data',
field=models.JSONField(blank=True, encoder=django.core.serializers.json.DjangoJSONEncoder, null=True, verbose_name='Summary Data'),
),
]
17 changes: 17 additions & 0 deletions main/migrations/0096_remove_session_summary_data.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Generated by Django 4.2.3 on 2023-09-08 15:44

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
('main', '0095_sessionperiod_summary_data'),
]

operations = [
migrations.RemoveField(
model_name='session',
name='summary_data',
),
]
103 changes: 59 additions & 44 deletions main/models/session.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ class Session(models.Model):
world_state = models.JSONField(encoder=DjangoJSONEncoder, null=True, blank=True, verbose_name="Current Session State") #world state at this point in session
world_state_avatars = models.JSONField(encoder=DjangoJSONEncoder, null=True, blank=True, verbose_name="Current Avatar State") #world state at this point in session

summary_data = models.JSONField(encoder=DjangoJSONEncoder, null=True, blank=True, verbose_name="Summary Data") #summary data for session
# summary_data = models.JSONField(encoder=DjangoJSONEncoder, null=True, blank=True, verbose_name="Summary Data") #summary data for session

soft_delete = models.BooleanField(default=False) #hide session if true

Expand Down Expand Up @@ -133,55 +133,67 @@ def setup_summary_data(self):
'''
setup summary data
'''

parameter_set_groves = self.parameter_set.parameter_set_groves_a.values('id').all()
session_players = self.session_players.values('id','parameter_set_player__id').all()

self.summary_data = {}

parameter_set_groves = self.parameter_set.parameter_set_groves_a.values('id').all()
session_players = self.session_players.values('id').all()
# parameter_set_groves = self.parameter_set.parameter_set_groves_a.values('id').all()
# session_players = self.session.session_players.values('id').all()

for i in self.session_periods.all():
period_number = i.period_number
# period_number = self.period_number

id = str(i.id)
id = self.id

self.summary_data[id] = {}
summary_data = {}

for j in session_players:
j_s = str(j["id"])
self.summary_data[id][j_s] = {}
v = self.summary_data[id][j_s]
for j in session_players:
j_s = str(j["id"])
summary_data[j_s] = {}
v = summary_data[j_s]

v["period_earnings"] = 0
v["start_health"] = None
v["end_health"] = None
v["health_from_sleep"] = 0
v["health_from_house"] = 0

v["period_earnings"] = 0
v["start_health"] = 100 if period_number==1 else None
v["end_health"] = None
v["health_from_sleep"] = 0
v["health_from_house"] = 0
#total harvested / consumption
for k in main.globals.Goods.choices:
v["harvest_total_" + k[0]] = 0
v["house_" + k[0]] = 0
v["avatar_" + k[0]] = 0

#groves
for k in parameter_set_groves:
k_s = str(k["id"])
v["grove_harvests_count_" + k_s] = 0
v["grove_harvests_total_" + k_s] = 0

#total harvested / consumption
for k in main.globals.Goods.choices:
v["harvest_total_" + k[0]] = 0
v["house_" + k[0]] = 0
v["avatar_" + k[0]] = 0

#groves
for k in parameter_set_groves:
k_s = str(k["id"])
v["grove_harvests_count_" + k_s] = 0
v["grove_harvests_total_" + k_s] = 0

#interactions with others
for k in session_players:
k_s = str(k["id"])
v["attacks_at_" + k_s] = 0
v["attacks_from_" + k_s] = 0
v["attacks_cost_at_" + k_s] = 0
v["attacks_damage_from_" + k_s] = 0

for l in main.globals.Goods.choices:
v["send_avatar_to_avatar_" + k_s + "_good_" + l[0]] = 0
v["send_avatar_to_house_" + k_s + "_good_" + l[0]] = 0
#interactions with others
for k in session_players:
k_s = str(k["id"])
v["attacks_at_" + k_s] = 0
v["attacks_from_" + k_s] = 0
v["attacks_cost_at_" + k_s] = 0
v["attacks_damage_from_" + k_s] = 0

self.save()
for l in main.globals.Goods.choices:
v["send_avatar_to_avatar_" + k_s + "_good_" + l[0]] = 0
v["send_avatar_to_house_" + str(k["parameter_set_player__id"]) + "_good_" + l[0]] = 0


self.session_periods.all().update(summary_data=summary_data)

session_period_1 = self.session_periods.get(period_number=1)

#set starting health
for i in session_period_1.summary_data:
session_period_1.summary_data[i]["start_health"] = 100

session_period_1.save()

def setup_world_state(self):
'''
setup world state
Expand Down Expand Up @@ -370,8 +382,7 @@ def get_download_summary_csv(self):
with io.StringIO() as output:

world_state = self.world_state
summary_data = self.summary_data


parameter_set_players = {}
for i in self.session_players.all().values('id','parameter_set_player__id_label'):
parameter_set_players[str(i['id'])] = i
Expand Down Expand Up @@ -414,8 +425,10 @@ def get_download_summary_csv(self):
# logger.info(parameter_set_players)

for period_number, period in enumerate(world_state["session_periods"]):
summary_data = self.session_periods.get(id=period).summary_data

for player_number, player in enumerate(world_state["avatars"]):
temp_p = summary_data[period][player]
temp_p = summary_data[player]

temp_row = [self.id,
period_number+1,
Expand All @@ -440,6 +453,8 @@ def get_download_summary_csv(self):

#avatar interactions
for k in world_state["avatars"]:
parameter_set_player_id = str(world_state["avatars"][k]["parameter_set_player_id"])

temp_row.append(temp_p["attacks_at_" + k])
temp_row.append(temp_p["attacks_from_" + k])
temp_row.append(temp_p["attacks_cost_at_" + k])
Expand All @@ -449,7 +464,7 @@ def get_download_summary_csv(self):
temp_row.append(temp_p["send_avatar_to_avatar_" + k + "_good_" + l[0]])

for l in main.globals.Goods.choices:
temp_row.append(temp_p["send_avatar_to_house_" + k + "_good_" + l[0]])
temp_row.append(temp_p["send_avatar_to_house_" + parameter_set_player_id + "_good_" + l[0]])


#grove harvests
Expand Down
Loading

0 comments on commit e28b87c

Please sign in to comment.