from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, ) import os import pdfkit author = 'Your name here' doc = """ Your app description """ class Constants(BaseConstants): name_in_url = 'payment_control' players_per_group = None num_rounds = 1 expt_point = 0.2 class Subsession(BaseSubsession): pass class Group(BaseGroup): def ack_payment(self, id_in_group, payload): print(payload) self.get_player_by_id(id_in_group).mobile_number = payload['mobile_number'] self.get_player_by_id(id_in_group).name = payload['name'] try: os.mkdir('receipts') except FileExistsError: pass try: folderName = str(self.session.code) path = os.path.join('receipts', folderName) os.mkdir(path) except FileExistsError: pass player = self.get_player_by_id(id_in_group) pdfPath = f'receipts/{self.session.id}/{player.participant.id_in_session}.pdf' pdfkit.from_string(payload['receipt_html'], pdfPath) class Player(BasePlayer): mobile_number = models.StringField() name = models.StringField() payoff_from_round = models.IntegerField() receipt_ack = models.BooleanField( widget=widgets.CheckboxInput, ) def start(self): self.payoff = self.participant.vars['Stage3Earning']['Earning'] self.payoff_from_round = self.participant.vars['Stage3Earning']['Round'] def custom_export(players): # header row yield ['session', 'participant_code', 'participant_id', 'payoff from stage 3', 'payoff from round', 'full name', 'mobile number'] for p in players: yield [p.session.code, p.participant.code, p.participant.id_in_session, p.payoff, p.payoff_from_round, p.name, p.mobile_number]