Skip to content

Commit

Permalink
Merge pull request #122 from jeffreykirchner/dev
Browse files Browse the repository at this point in the history
Dev
  • Loading branch information
jeffreykirchner authored Sep 18, 2023
2 parents 51f1bd2 + 69e9d3d commit 8a46778
Show file tree
Hide file tree
Showing 23 changed files with 308 additions and 32 deletions.
14 changes: 14 additions & 0 deletions main/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
from main.forms import SessionFormAdmin
from main.forms import InstructionFormAdmin
from main.forms import InstructionSetFormAdmin
from main.forms import HelpDocSubjectFormAdmin

from main.models import Parameters
from main.models import ParameterSet
Expand All @@ -28,6 +29,7 @@

from main.models.instruction_set import InstructionSet
from main.models.instruction import Instruction
from main.models.help_docs_subject import HelpDocsSubject

admin.site.site_header = settings.ADMIN_SITE_HEADER

Expand Down Expand Up @@ -279,6 +281,16 @@ class InstructionPageInline(admin.TabularInline):
model = Instruction
can_delete = True

#instruction set page
class HelpDocSubjectInline(admin.TabularInline):
'''
instruction page admin screen
'''
extra = 0
form = HelpDocSubjectFormAdmin
model = HelpDocsSubject
can_delete = True

@admin.register(InstructionSet)
class InstructionSetAdmin(admin.ModelAdmin):
form = InstructionSetFormAdmin
Expand All @@ -304,13 +316,15 @@ def duplicate_set(self, request, queryset):
instruction_set.save()

instruction_set.copy_pages(base_instruction_set.instructions)
instruction_set.copy_help_docs_subject(base_instruction_set.help_docs_subject)

self.message_user(request,f'{base_instruction_set} has been duplicated', messages.SUCCESS)

duplicate_set.short_description = "Duplicate Instruction Set"

inlines = [
InstructionPageInline,
HelpDocSubjectInline,
]

actions = [duplicate_set]
Expand Down
1 change: 1 addition & 0 deletions main/consumers/subject/subject_home_consumer.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ class SubjectHomeConsumer(SocketConsumerMixin,
InstructionsMixin,
PhaseMixin,
TimeMixin,
GetHelpDocSubject,
InterfaceMixin):
'''
websocket methods for subject home
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,5 @@
from .intructions import InstructionsMixin
from .phase import PhaseMixin
from .time import TimeMixin
from .interface import InterfaceMixin
from .interface import InterfaceMixin
from .help_doc_subject import GetHelpDocSubject
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import logging
import json

from asgiref.sync import sync_to_async

from django.core.serializers.json import DjangoJSONEncoder

from main.models import Session
from main.models import SessionPlayer
from main.models import SessionEvent

import main

class GetHelpDocSubject():
'''
Get help doc subject mixin for subject home consumer
'''
async def help_doc_subject(self, event):
'''
take help doc request
'''

try:
message_text = event["message_text"]
title = message_text["title"]

session_player = await SessionPlayer.objects.select_related('session','session__parameter_set', 'session__parameter_set__instruction_set').aget(player_key=self.connection_uuid)
instruction_set = session_player.session.parameter_set.instruction_set
help_doc_subject = await instruction_set.help_docs_subject.all().aget(title=title)
text = await sync_to_async(session_player.process_instruction_text, thread_sensitive=False)(help_doc_subject.text)

except Exception as e:
text = "Help doc not found"

await SessionEvent.objects.acreate(session_id=session_player.session.id,
session_player_id=session_player.id,
type="help_doc",
period_number=session_player.session.world_state["current_period"],
time_remaining=session_player.session.world_state["time_remaining"],
data=title)


result = {"value" : "success",
"result" : {"text" : text}}

await self.send_message(message_to_self=result, message_to_subjects=None, message_to_staff=None,
message_type=event['type'], send_to_client=True, send_to_group=False)
2 changes: 1 addition & 1 deletion main/fixtures/InstructionSet.json

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions main/forms/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
from .session_form_admin import SessionFormAdmin
from .instruction_set_form_admin import InstructionSetFormAdmin
from .instruction_form_admin import InstructionFormAdmin
from .help_doc_subject_form_admin import HelpDocSubjectFormAdmin

from .end_game_form import EndGameForm
from .interaction_form import InteractionForm
21 changes: 21 additions & 0 deletions main/forms/help_doc_subject_form_admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
'''
help doc subject form admin screen
'''
from django import forms
from main.models import Instruction
from tinymce.widgets import TinyMCE

class HelpDocSubjectFormAdmin(forms.ModelForm):
'''
help doc subject form admin screen
'''

title = forms.CharField(label='Title',
widget=forms.TextInput(attrs={"width":"300px"}))

text = forms.CharField(label='Page HTML Text',
widget=TinyMCE(attrs={"rows":20, "cols":200, "plugins": "link image code"}))

class Meta:
model=Instruction
fields = ('title', 'text')
35 changes: 35 additions & 0 deletions main/migrations/0109_helpdocssubject_and_more.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# Generated by Django 4.2.3 on 2023-09-17 19:40

from django.db import migrations, models
import django.db.models.deletion
import tinymce.models


class Migration(migrations.Migration):

dependencies = [
('main', '0108_alter_parameterset_instruction_set'),
]

operations = [
migrations.CreateModel(
name='HelpDocsSubject',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(default='', max_length=300, verbose_name='Title')),
('text', tinymce.models.HTMLField(default='', max_length=100000, verbose_name='Help Doc Text')),
('timestamp', models.DateTimeField(auto_now_add=True)),
('updated', models.DateTimeField(auto_now=True)),
('instruction_set', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='help_docs_subjects', to='main.instructionset')),
],
options={
'verbose_name': 'Help Doc Subject',
'verbose_name_plural': 'Help Docs Subject',
'ordering': ['title'],
},
),
migrations.AddConstraint(
model_name='helpdocssubject',
constraint=models.UniqueConstraint(fields=('instruction_set', 'title'), name='unique_help_doc_subject '),
),
]
19 changes: 19 additions & 0 deletions main/migrations/0110_alter_helpdocssubject_instruction_set.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Generated by Django 4.2.3 on 2023-09-17 21:31

from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

dependencies = [
('main', '0109_helpdocssubject_and_more'),
]

operations = [
migrations.AlterField(
model_name='helpdocssubject',
name='instruction_set',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='help_docs_subject', to='main.instructionset'),
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Generated by Django 4.2.3 on 2023-09-17 21:36

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('main', '0110_alter_helpdocssubject_instruction_set'),
]

operations = [
migrations.RemoveConstraint(
model_name='helpdocssubject',
name='unique_help_doc_subject ',
),
migrations.AddConstraint(
model_name='helpdocssubject',
constraint=models.UniqueConstraint(fields=('instruction_set', 'title'), name='unique_help_doc_subject'),
),
]
1 change: 1 addition & 0 deletions main/models/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

from .instruction_set import InstructionSet
from .instruction import Instruction
from .help_docs_subject import HelpDocsSubject

from .parameter_set import ParameterSet
from .parameter_set_group import ParameterSetGroup
Expand Down
37 changes: 37 additions & 0 deletions main/models/help_docs_subject.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
'''
help document subject
'''
from tinymce.models import HTMLField
from django.db import models

from main.models import InstructionSet

class HelpDocsSubject(models.Model):
'''
help document
'''
instruction_set = models.ForeignKey(InstructionSet, on_delete=models.CASCADE, related_name="help_docs_subject")

title = models.CharField(verbose_name = 'Title', max_length = 300, default="")
text = HTMLField(verbose_name = 'Help Doc Text', max_length = 100000, default="")

timestamp = models.DateTimeField(auto_now_add=True)
updated= models.DateTimeField(auto_now=True)

class Meta:
verbose_name = 'Help Doc Subject'
verbose_name_plural = 'Help Docs Subject'
ordering = ['title']
constraints = [
models.UniqueConstraint(fields=['instruction_set', 'title'], name='unique_help_doc_subject'),
]

def __str__(self):
return self.title

def json(self):
return{
"id":self.id,
"title":self.title,
"text":self.text,
}
10 changes: 9 additions & 1 deletion main/models/instruction_set.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,15 @@ def copy_pages(self, i_set):
instructions.append(main.models.Instruction(instruction_set=self, text_html=i.text_html, page_number=i.page_number))

main.models.Instruction.objects.bulk_create(instructions)

def copy_help_docs_subject(self, i_set):

help_docs_subject = []

for i in i_set.all():
help_docs_subject.append(main.models.HelpDocsSubject(instruction_set=self, title=i.title, text=i.text))

main.models.HelpDocsSubject.objects.bulk_create(help_docs_subject)

#return json object of class
def json(self):
Expand Down Expand Up @@ -76,7 +85,6 @@ def json_min(self):

return{
"id" : self.id,

"label" : self.label,
}

47 changes: 29 additions & 18 deletions main/models/session_player.py
Original file line number Diff line number Diff line change
Expand Up @@ -100,34 +100,45 @@ def get_instruction_set(self):
return a proccessed list of instructions to the subject
'''

parameter_set = self.parameter_set_player.parameter_set.json()
parameter_set_player = parameter_set["parameter_set_players"][str(self.parameter_set_player.id)]
group_name = parameter_set["parameter_set_groups"][str(parameter_set_player["parameter_set_group"])]["name"]


instruction_pages = [i.json() for i in self.parameter_set_player.parameter_set.instruction_set.instructions.all()]

for i in instruction_pages:
i["text_html"] = i["text_html"].replace("#player_count-1#", str(len(parameter_set["parameter_set_players"])-1))
i["text_html"] = i["text_html"].replace("#id_label#", parameter_set_player["id_label"])
i["text_html"] = i["text_html"].replace("#cents_per_second#", str(round_half_away_from_zero(parameter_set["cents_per_second"],3)))
i["text_html"] = i["text_html"].replace("#health_loss_per_second#", str(round_half_away_from_zero(parameter_set["health_loss_per_second"],3)))
i["text_html"] = i["text_html"].replace("#healthpoints_6_6#", str(main.globals.convert_goods_to_health(6,6,0,parameter_set)))
i["text_html"] = i["text_html"].replace("#healthpoints_10_2#", str(main.globals.convert_goods_to_health(10,2,0,parameter_set)))
i["text_html"] = i["text_html"].replace("#night_length#", str(parameter_set["night_length"]))
i["text_html"] = i["text_html"].replace("#heath_gain_per_sleep_second#", str(round_half_away_from_zero(parameter_set["heath_gain_per_sleep_second"],3)))
i["text_html"] = i["text_html"].replace("#attack_cost#", str(round_half_away_from_zero(parameter_set["attack_cost"],3)))
i["text_html"] = i["text_html"].replace("#attack_damage#", str(round_half_away_from_zero(parameter_set["attack_damage"],3)))
i["text_html"] = i["text_html"].replace("#cool_down_length#", str(parameter_set["cool_down_length"]))
i["text_html"] = i["text_html"].replace("#number_of_groups#", str(len(parameter_set["parameter_set_groups"])))
i["text_html"] = i["text_html"].replace("#group_name#", group_name)
i["text_html"] = i["text_html"].replace("#break_frequency#", str(parameter_set["break_frequency"]))
i["text_html"] = i["text_html"].replace("#break_length#", str(parameter_set["break_length"]))
i["text_html"] = self.process_instruction_text(i["text_html"])

instructions = self.parameter_set_player.parameter_set.instruction_set.json()
instructions["instruction_pages"] = instruction_pages

return instructions

def process_instruction_text(self, text):
'''
process instruction text
'''

parameter_set = self.parameter_set_player.parameter_set.json()
parameter_set_player = parameter_set["parameter_set_players"][str(self.parameter_set_player.id)]
group_name = parameter_set["parameter_set_groups"][str(parameter_set_player["parameter_set_group"])]["name"]

text = text.replace("#player_count-1#", str(len(parameter_set["parameter_set_players"])-1))
text = text.replace("#id_label#", parameter_set_player["id_label"])
text = text.replace("#cents_per_second#", str(round_half_away_from_zero(parameter_set["cents_per_second"],3)))
text = text.replace("#health_loss_per_second#", str(round_half_away_from_zero(parameter_set["health_loss_per_second"],3)))
text = text.replace("#healthpoints_6_6#", str(main.globals.convert_goods_to_health(6,6,0,parameter_set)))
text = text.replace("#healthpoints_10_2#", str(main.globals.convert_goods_to_health(10,2,0,parameter_set)))
text = text.replace("#night_length#", str(parameter_set["night_length"]))
text = text.replace("#heath_gain_per_sleep_second#", str(round_half_away_from_zero(parameter_set["heath_gain_per_sleep_second"],3)))
text = text.replace("#attack_cost#", str(round_half_away_from_zero(parameter_set["attack_cost"],3)))
text = text.replace("#attack_damage#", str(round_half_away_from_zero(parameter_set["attack_damage"],3)))
text = text.replace("#cool_down_length#", str(parameter_set["cool_down_length"]))
text = text.replace("#number_of_groups#", str(len(parameter_set["parameter_set_groups"])))
text = text.replace("#group_name#", group_name)
text = text.replace("#break_frequency#", str(parameter_set["break_frequency"]))
text = text.replace("#break_length#", str(parameter_set["break_length"]))

return text

def get_survey_link(self):
'''
get survey link
Expand Down
29 changes: 29 additions & 0 deletions main/templates/subject/subject_home/help_doc_subject.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
/**
* send request for help doc
* @param title : string
*/
send_load_help_doc_subject(title){
app.working = true;
app.help_text = "Loading ...";

app.help_modal.show();

app.send_message("help_doc_subject", {title : title});
},

/**
* take help text load request
* @param message_data : json
*/
take_load_help_doc_subject(message_data){

if(message_data.value == "success")
{
app.help_text = message_data.result.text;
}
else
{
app.help_text = message_data.message;
}
},

Loading

0 comments on commit 8a46778

Please sign in to comment.