def __init__(self, le2mserv): super(GuiServeur, self).__init__() self._le2mserv = le2mserv self._questcomp = None self.ui = servguimain.Ui_EcranServeur() self.ui.setupUi(self) self._create_menus() self.ui.label_le2m.setText(le2mtrans(u"LE2M\nExperimental Economics Software of Montpellier")) # tabs self.ui.onglets.setTabText(self.ui.onglets.indexOf(self.ui.tabInfos), le2mtrans(u"Informations")) self.ui.onglets.setTabText(self.ui.onglets.indexOf(self.ui.tabClients), le2mtrans(u"Remotes")) self.ui.onglets.setTabText(self.ui.onglets.indexOf(self.ui.tabExperience), le2mtrans(u"Experiment")) # picture on the first tab --------------------------------------------- try: img_labo_pix = QtGui.QPixmap(params.getp("LABLOGO")) self.ui.label_logo_laboratoire.setPixmap(img_labo_pix) except IOError: logger.warning(u"Error while loading LABLOGO picture") self.ui.label_logo_laboratoire.setText(le2mtrans(u"Here the logo of the lab")) try: img_leem_pix = QtGui.QPixmap(params.getp("LABPICTURE")) self.ui.label_image_centre.setPixmap(img_leem_pix) except IOError: logger.warning(u"Error while loading LABPICTURE picture") self.ui.label_image_centre.setText(le2mtrans(u"Here the main picture")) # icons for the waiting mode ------------------------------------------- self._icon_rouge = QtGui.QIcon(os.path.join(params.getp("IMGDIR"), "red.png")) self._icon_vert = QtGui.QIcon(os.path.join(params.getp("IMGDIR"), "green.png")) self.ui.label_attente.setText(le2mtrans(u"Decisions")) self._players_wait_mode = list() # server infos --------------------------------------------------------- self.ui.label_infos_serveur.setText( u"OS: {} {} | Python version: {} | Hostname: {} | IP: {}".format( platform.uname()[0], platform.uname()[2], sys.version.split()[0], self._le2mserv.hostname, self._le2mserv.ip, ) ) # table on the second tab with connected remotes ----------------------- # handle automatic and simulation modes as well as remotes' deconnection self.ui.label_connectedremotes.setText(le2mtrans(u"Connected remotes: 0")) self.tableJoueurs = TableModelJoueurs() self.ui.tv_clients_connectes.setModel(self.tableJoueurs) self.ui.tv_clients_connectes.horizontalHeader().setResizeMode(QtGui.QHeaderView.Stretch) self.ui.tv_clients_connectes.horizontalHeader().setClickable(True) self.ui.tv_clients_connectes.horizontalHeader().sectionClicked[int].connect(self.tableJoueurs.inverse) self.ui.onglets.setCurrentIndex(0) self.setWindowTitle(le2mtrans(u"LE2M"))
def __init__(self, parent=None): super(GuiPartLoad, self).__init__(parent) self.ui = servguipartsload.Ui_Dialog() self.ui.setupUi(self) # parts list self.ui.label_explication.setText( le2mtrans(u"Please select in the list below the parts you want " u"to load")) self.ui.listView.setToolTip( QtCore.QString(le2mtrans(u"Select the part(s) you want to load"))) # database directory self.ui.label_basepath.setText( le2mtrans(u"Directory in which to store the database")) self.ui.label_basepath1.setText(le2mtrans(u"Directory path (check)")) self.ui.label_basepath2.setText("...") # database name self.ui.label_basename.setText( le2mtrans(u"Database name (without the sqlite extension")) self.ui.lineEdit_nom_base.setText(u"data") self.ui.label_nom_base_extension.setText(u".sqlite") # test session self.ui.label_test.setText(le2mtrans(u"Test session")) self.ui.checkBox_test.setToolTip( le2mtrans(u"Uncheck if this is not a test session")) self.ui.checkBox_test.setChecked(True) self.ui.pushButton_base.setText(le2mtrans(u"Browse")) # connections self.ui.pushButton_base.clicked.connect(self._set_directorydatabase) self.ui.buttonBox.accepted.connect(self._accept) self.ui.buttonBox.rejected.connect(self.reject) # list of parts in the PARTSDIR directory partslist = [ f for f in os.listdir(params.getp("PARTSDIR")) if os.path.isdir(os.path.join(params.getp("PARTSDIR"), f)) and not f.startswith(".") ] partslist.sort() self._model = QtGui.QStandardItemModel() for p in partslist: item = QtGui.QStandardItem(p) item.setCheckState(QtCore.Qt.Unchecked) item.setCheckable(True) item.setEditable(False) self._model.appendRow(item) self._model.itemChanged.connect(self._onitemchanged) self.ui.listView.setModel(self._model) self.setWindowTitle(le2mtrans(u"List of parts that can be loaded")) self.adjustSize()
def __init__(self, parent=None): super(GuiPartLoad, self).__init__(parent) self.ui = servguipartsload.Ui_Dialog() self.ui.setupUi(self) # parts list self.ui.label_explication.setText( le2mtrans(u"Please select in the list below the parts you want " u"to load")) self.ui.listView.setToolTip(QtCore.QString( le2mtrans(u"Select the part(s) you want to load"))) # database directory self.ui.label_basepath.setText( le2mtrans(u"Directory in which to store the database")) self.ui.label_basepath1.setText(le2mtrans(u"Directory path (check)")) self.ui.label_basepath2.setText("...") # database name self.ui.label_basename.setText( le2mtrans(u"Database name (without the sqlite extension")) self.ui.lineEdit_nom_base.setText(u"data") self.ui.label_nom_base_extension.setText(u".sqlite") # test session self.ui.label_test.setText(le2mtrans(u"Test session")) self.ui.checkBox_test.setToolTip( le2mtrans(u"Uncheck if this is not a test session")) self.ui.checkBox_test.setChecked(True) self.ui.pushButton_base.setText(le2mtrans(u"Browse")) # connections self.ui.pushButton_base.clicked.connect(self._set_directorydatabase) self.ui.buttonBox.accepted.connect(self._accept) self.ui.buttonBox.rejected.connect(self.reject) # list of parts in the PARTSDIR directory partslist = [f for f in os.listdir(params.getp("PARTSDIR")) if os.path.isdir(os.path.join(params.getp("PARTSDIR"), f)) and not f.startswith(".")] partslist.sort() self._model = QtGui.QStandardItemModel() for p in partslist: item = QtGui.QStandardItem(p) item.setCheckState(QtCore.Qt.Unchecked) item.setCheckable(True) item.setEditable(False) self._model.appendRow(item) self._model.itemChanged.connect(self._onitemchanged) self.ui.listView.setModel(self._model) self.setWindowTitle(le2mtrans(u"List of parts that can be loaded")) self.adjustSize()
def start(self): """ Démarrage du client, il se connecte au serveur, et récupère une instance de la partie visible sur le réseau du serveur (fonctions qui commencent par remote)/ Ensuite se connecte au serveur. """ logger.info(u"{} Connection to le2m server".format(self)) factory = pb.PBClientFactory() reactor.connectTCP(params.getp("SERVIP"), params.getp("SERVPORT"), factory) defered = factory.getRootObject() defered.addCallback(self._connect) reactor.run()
def install(): global le2mtrans try: le2mtrans = gettext.translation( "le2m", localedir, languages=[params.getp("LANG")]).ugettext except IOError: le2mtrans = gettext.translation("le2m", localedir).ugettext
def __init__(self, **kwargs): # network infos self._port_ecoute = kwargs["port"] self._hostname = socket.gethostname() self._ip = socket.gethostbyname(self._hostname) logger.info("Hostname: {}".format(self._hostname)) logger.info("IP: {}".format(self._ip)) # création de la session self._heure_debut = strftime("%H:%M:%S") self._nom_session = strftime('%Y%m%d%H%M') logger.info("Session name: {}".format(self._nom_session)) # les gestionnaires self.gestionnaire_graphique = GestionnaireGraphique(self) self.gestionnaire_base = GestionnaireBase(self) self.gestionnaire_joueurs = GestionnaireJoueurs(self) self.gestionnaire_groupes = GestionnaireGroupes(self) self.gestionnaire_experience = GestionnaireExperience(self) # we connect some slot now, after instanciating the other gestionnaires self.gestionnaire_graphique.screen.connect_slots() self.gestionnaire_graphique.screen.show() # if option -e in the command line if kwargs["parts"]: expeinfos = Experiment( kwargs["parts"], kwargs["dirbase"] or os.path.join( params.getp("PARTSDIR"), kwargs["parts"][0]), kwargs["namebase"], kwargs["test"]) self.gestionnaire_experience.load_experiment(expeinfos)
def _display_help(self): """ Display a dialog with some help on le2m """ help_file = os.path.join(params.getp("HTMLDIR"), "le2m_aide.html") webscreen = DWebview(help_file, title=le2mtrans(u"Help"), parent=self) webscreen.show()
def install(): global le2mtrans try: le2mtrans = gettext.translation("le2m", localedir, languages=[params.getp("LANG") ]).ugettext except IOError: le2mtrans = gettext.translation("le2m", localedir).ugettext
def _display_about(self): """ Display a dialog with some infos about the authors of le2m """ fichier_auteurs = os.path.join( params.getp("HTMLDIR"), "le2m_auteurs.html") screen = GuiInformation( parent=self, titre=le2mtrans(u"Developers"), size=(450, 180), html=True, text=utiltools.get_contenu_fichier(fichier_auteurs)) screen.show()
def _onitemchanged(self, item): """ This is for setting a dir to the database We use the item just checked If the item is just unchecked then search for a checked one If no item we set ... """ if item.checkState() == QtCore.Qt.Checked: part = str(item.text()) self.ui.label_basepath2.setText( os.path.join(params.getp("PARTSDIR"), part)) elif item.checkState() == QtCore.Qt.Unchecked: self.ui.label_basepath2.setText("...") i = 0 while self._model.item(i): if self._model.item(i).checkState() == QtCore.Qt.Checked: part = str(self._model.item(i).text()) self.ui.label_basepath2.setText( os.path.join(params.getp("PARTSDIR"), part)) break i += 1
def _display_about(self): """ Display a dialog with some infos about the authors of le2m """ fichier_auteurs = os.path.join(params.getp("HTMLDIR"), "le2m_auteurs.html") screen = GuiInformation( parent=self, titre=le2mtrans(u"Developers"), size=(450, 180), html=True, text=utiltools.get_contenu_fichier(fichier_auteurs)) screen.show()
def _set_directorydatabase(self): """ Permet de choisir le dossier dans lequel sera sauvegardée la base de données sqlite :return: """ dirbase = str(QtGui.QFileDialog.getExistingDirectory( self, le2mtrans(u"Select the directory in which to store the database."), params.getp("PARTSDIR")) ) if not dirbase: return else: self._databasepath = dirbase self.ui.label_basepath2.setText(dirbase)
def _set_directorydatabase(self): """ Permet de choisir le dossier dans lequel sera sauvegardée la base de données sqlite :return: """ dirbase = str( QtGui.QFileDialog.getExistingDirectory( self, le2mtrans( u"Select the directory in which to store the database."), params.getp("PARTSDIR"))) if not dirbase: return else: self._databasepath = dirbase self.ui.label_basepath2.setText(dirbase)
def __init__(self, defered, automatique, parent): super(GuiAccueil, self).__init__(parent) # variables self._defered = defered self._automatique = automatique # creation gui self.ui = cltguiwelc.Ui_Dialog() self.ui.setupUi(self) # centre écran avec image labo welcfont = self.ui.label_welcome.font() welcfont.setPointSize(20) welcfont.setBold(True) self.ui.label_welcome.setText(u"<font color='blue'>{}</font>".format( textes.ACCUEIL_label_welcome)) try: img_labo_pix = QtGui.QPixmap(params.getp("WELCOMEPICTURE")) self.ui.label_image_accueil.setPixmap(img_labo_pix) except IOError: self.ui.label_image_accueil.setText( textes.ACCUEIL_label_image_accueil) self.ui.label_instructions.setText( le2mtrans(u"Please read the instructions that stand beside the " u"computer. You are asked to click on the button below " u"when you have finished.")) # bouton self.ui.pushButton_valider.setText(le2mtrans(u"Instructions read")) self.ui.pushButton_valider.clicked.connect(self._accept) self.setWindowTitle(textes.ACCUEIL_titre) self.setFixedSize(900, 575) if self._automatique: self._timer = QtCore.QTimer() self._timer.timeout.connect(self._accept) self._timer.start(7000)
# -*- coding: utf-8 -*- """ Ce module contient les textes des écrans """ __author__ = "Dimitri DUBOIS" import os import logging import configuration.configparam as params from util.utiltools import get_pluriel import PublicGoodLocalGlobalParams as pms import gettext logger = logging.getLogger("le2m") localedir = os.path.join(params.getp("PARTSDIR"), "PublicGoodLocalGlobal", "locale") try: trans_PGLG = gettext.translation("PublicGoodLocalGlobal", localedir, languages=[params.getp("LANG")]).ugettext except IOError: logger.critical(u"Translation file not found") trans_PGLG = lambda x: x # if there is an error, no translation def get_histo_head(): return [ trans_PGLG(u"Period"), trans_PGLG(u"Individual\naccount"), trans_PGLG(u"Local\naccount"), trans_PGLG(u"Global\naccount"),
# -*- coding: utf-8 -*- """ Ce module contient les textes des écrans """ __author__ = "Dimitri DUBOIS" import os import configuration.configparam as params from collections import namedtuple from util.utiltools import get_pluriel import PublicGoodGameParams as pms import gettext localedir = os.path.join(params.getp("PARTSDIR"), "PublicGoodGame", "locale") trans_PGG = gettext.translation("PublicGoodGame", localedir, languages=[params.getp("LANG")]).ugettext TITLE_MSG = namedtuple("TITLE_MSG", "titre message") def get_histo_head(): return [ trans_PGG(u"Period"), trans_PGG(u"Individual\naccount"), trans_PGG(u"Public\naccount"), trans_PGG(u"Public\naccount\ngroup"), trans_PGG(u"Period\npayoff"), trans_PGG(u"Cumulative\npayoff") ]
# -*- coding: utf-8 -*- """ Ce module contient les textes des écrans """ __author__ = "Dimitri DUBOIS" import os from collections import OrderedDict import configuration.configparam as params import gettext localedir = os.path.join(params.getp("PARTSDIR"), "Dictator", "locale") trans_DIC = gettext.translation( "Dictator", localedir, languages=[params.getp("LANG")], fallback=True).ugettext from collections import namedtuple from util.utiltools import get_pluriel from parts.Dictator import DictatorParams as pms import logging logger = logging.getLogger("le2m") TITLE_MSG = namedtuple("TITLE_MSG", "titre message") # HISTO ======================================================================== histo_build = {} def get_histo_build(role): global histo_build if not histo_build.get(role): hb = OrderedDict() if role == pms.PLAYER_A: hb["DIC_decision"] = trans_DIC(u"Decision") elif role == pms.PLAYER_B:
# -*- coding: utf-8 -*- from util.utiltools import get_pluriel import voteMajoriteParams as pms import os import configuration.configparam as params import gettext import logging logger = logging.getLogger("le2m") localedir = os.path.join(params.getp("PARTSDIR"), "voteMajorite", "locale") trans_VM = gettext.translation( "voteMajorite", localedir, languages=[params.getp("LANG")]).ugettext VOTES = { pms.IN_FAVOR: trans_VM("In favor"), pms.AGAINST: trans_VM("Against") } def get_vote(code_or_name): logger.debug(u"get_vote with arg {}".format(code_or_name)) if type(code_or_name) is int: return VOTES.get(code_or_name, None) elif type(code_or_name) is str: for k, v in VOTES.viewitems(): if v.lower() == code_or_name.lower(): return k return None
# -*- coding: utf-8 -*- """ This module contains the texts of the part (server and remote) """ from util.utiltools import get_pluriel import MarketRiskInsuranceParams as pms # from util.utili18n import le2mtrans import os import configuration.configparam as params import gettext import logging logger = logging.getLogger("le2m") try: localedir = os.path.join(params.getp("PARTSDIR"), "MarketRiskInsurance", "locale") trans_MRI = gettext.translation("MarketRiskInsurance", localedir, languages=[params.getp("LANG")]).ugettext except (AttributeError, IOError): logger.critical(u"Translation file not found") trans_MRI = lambda x: x # if there is an error, no translation def get_histo_vars(): return [ "MRI_period", "MRI_endowment_triangle", "MRI_endowment_star", "MRI_triangle_number_of_purchase", "MRI_triangle_sum_of_purchase", "MRI_triangle_number_of_sell", "MRI_triangle_sum_of_sell", "MRI_star_number_of_purchase", "MRI_star_sum_of_purchase",
# -*- coding: utf-8 -*- __author__ = "Dimitri DUBOIS" from util.utili18n import le2mtrans from util.utiltools import get_pluriel from configuration import configparam as params PERIODE_label = lambda periode: le2mtrans(u"Period {p}").format(p=periode) # ECRAN ACCUEIL ACCUEIL_label_welcome = le2mtrans(u"Welcome to {welctext}").format( welctext=params.getp("WELCOMETEXT")) ACCUEIL_label_image_accueil = le2mtrans(u"Here the welcome picture") ACCUEIL_titre = le2mtrans(u"Welcome to the LEEM") ACCUEIL_bouton = le2mtrans(u"Instructions read") # QUESTIONNAIRE_FINAL QUESTFINAL_explication = \ le2mtrans(u"Please fill in the questionnaire below.\nThis questionnaire " u"is anonymous, so please answer with sincerity.") def get_payoff_text(pay_euros, pay_ecus=None): if pay_ecus is not None: txt = le2mtrans(u"You've earned {} which corresponds to {}.").format( get_pluriel(pay_ecus, u"ecu"), get_pluriel(pay_euros, u"euro")) else: txt = le2mtrans(u"You've earned {}.".format( get_pluriel(pay_euros, u"euro"))) return txt
# -*- coding: utf-8 -*- from util.utili18n import le2mtrans from util.utiltools import get_pluriel import PublicGoodGameSolidarityParams as pms import os import configuration.configparam as params import gettext localedir = os.path.join( params.getp("PARTSDIR"), "PublicGoodGameSolidarity", "locale") trans_PGGS = gettext.translation( "PublicGoodGameSolidarity", localedir, languages=[params.getp("LANG")]).ugettext VOTES = { pms.IN_FAVOR: trans_PGGS(u"In favor of"), pms.AGAINST: trans_PGGS(u"Against") } POLITICS = { 0: u"Extrême gauche", 1: u"Gauche", 2: u"Centre", 3: u"Droite", 4: u"Extrême droite" }
def __init__(self, le2mserv): super(GuiServeur, self).__init__() self._le2mserv = le2mserv self._questcomp = None self.ui = servguimain.Ui_EcranServeur() self.ui.setupUi(self) self._create_menus() self.ui.label_le2m.setText( le2mtrans(u"LE2M\nExperimental Economics Software of Montpellier")) # tabs self.ui.onglets.setTabText(self.ui.onglets.indexOf(self.ui.tabInfos), le2mtrans(u"Informations")) self.ui.onglets.setTabText(self.ui.onglets.indexOf(self.ui.tabClients), le2mtrans(u"Remotes")) self.ui.onglets.setTabText( self.ui.onglets.indexOf(self.ui.tabExperience), le2mtrans(u"Experiment")) # picture on the first tab --------------------------------------------- try: img_labo_pix = QtGui.QPixmap(params.getp("LABLOGO")) self.ui.label_logo_laboratoire.setPixmap(img_labo_pix) except IOError: logger.warning(u"Error while loading LABLOGO picture") self.ui.label_logo_laboratoire.setText( le2mtrans(u"Here the logo of the lab")) try: img_leem_pix = QtGui.QPixmap(params.getp("LABPICTURE")) self.ui.label_image_centre.setPixmap(img_leem_pix) except IOError: logger.warning(u"Error while loading LABPICTURE picture") self.ui.label_image_centre.setText( le2mtrans(u"Here the main picture")) # icons for the waiting mode ------------------------------------------- self._icon_rouge = QtGui.QIcon( os.path.join(params.getp("IMGDIR"), "red.png")) self._icon_vert = QtGui.QIcon( os.path.join(params.getp("IMGDIR"), "green.png")) self.ui.label_attente.setText(le2mtrans(u"Decisions")) self._players_wait_mode = list() # server infos --------------------------------------------------------- self.ui.label_infos_serveur.setText( u"OS: {} {} | Python version: {} | Hostname: {} | IP: {}".format( platform.uname()[0], platform.uname()[2], sys.version.split()[0], self._le2mserv.hostname, self._le2mserv.ip)) # table on the second tab with connected remotes ----------------------- # handle automatic and simulation modes as well as remotes' deconnection self.ui.label_connectedremotes.setText( le2mtrans(u"Connected remotes: 0")) self.tableJoueurs = TableModelJoueurs() self.ui.tv_clients_connectes.setModel(self.tableJoueurs) self.ui.tv_clients_connectes.horizontalHeader().\ setResizeMode(QtGui.QHeaderView.Stretch) self.ui.tv_clients_connectes.horizontalHeader().setClickable(True) self.ui.tv_clients_connectes.horizontalHeader().sectionClicked[int]. \ connect(self.tableJoueurs.inverse) self.ui.onglets.setCurrentIndex(0) self.setWindowTitle(le2mtrans(u"LE2M"))
# -*- coding: utf-8 -*- import os import configuration.configparam as params from configuration.configconst import PILE from collections import namedtuple from util.utiltools import get_pluriel import GneezyPotterParams as pms import gettext localedir = os.path.join(params.getp("PARTSDIR"), "GneezyPotter", "locale") trans_GP = gettext.translation( "GneezyPotter", localedir, languages=[params.getp("LANG")]).ugettext TITLE_MSG = namedtuple("TITLE_MSG", "titre message") def get_histo_header(): return [trans_GP(u"Investment\nin the risky\noption"), trans_GP(u"Result of\nthe random\ndraw"), trans_GP(u"Payoff")] def get_text_explanation(): txt = trans_GP(u"You have an endowment of {}. You can invest amount you want in the " u"risky option").format(get_pluriel(pms.DOTATION, pms.MONNAIE)) return txt
# -*- coding: utf-8 -*- """ This module contains the texts of the part (server and remote) """ from util.utiltools import get_pluriel import murielle_jeu_params as pms from util.utili18n import le2mtrans import os import configuration.configparam as params import gettext import logging logger = logging.getLogger("le2m") try: localedir = os.path.join(params.getp("PARTSDIR"), "murielle_jeu", "locale") trans_GA = gettext.translation("murielle_jeu", localedir, languages=[params.getp("LANG")]).ugettext except (AttributeError, IOError): logger.critical(u"Translation file not found") trans_GA = lambda x: x # if there is an error, no translation # ============================================================================== # EXPLANATIONS # ============================================================================== INITIAL_EXTRACTION = trans_GA(u"Please choose an initial extraction level") EXTRACTION = trans_GA(u"Please choose an extraction level")
# -*- coding: utf-8 -*- __author__ = "Dimitri DUBOIS" import os import gettext import configuration.configparam as params localedir = os.path.join(params.getp("APPDIR"), "locale") le2mtrans = None def install(): global le2mtrans try: le2mtrans = gettext.translation( "le2m", localedir, languages=[params.getp("LANG")]).ugettext except IOError: le2mtrans = gettext.translation("le2m", localedir).ugettext install()
# -*- coding: utf-8 -*- """ This module contains the texts of the part (server and remote) """ from util.utiltools import get_pluriel import EXPERIENCE_NOMParams as pms from util.utili18n import le2mtrans import os import configuration.configparam as params import gettext import logging logger = logging.getLogger("le2m") localedir = os.path.join(params.getp("PARTSDIR"), "EXPERIENCE_NOM", "locale") try: trans_EXPERIENCE_NOM_COURT = gettext.translation( "EXPERIENCE_NOM", localedir, languages=[params.getp("LANG")]).ugettext except IOError: logger.critical(u"Translation file not found") trans_EXPERIENCE_NOM_COURT = lambda x: x # if there is an error, no translation def get_histo_vars(): return ["EXPERIENCE_NOM_COURT_period", "EXPERIENCE_NOM_COURT_decision", "EXPERIENCE_NOM_COURT_periodpayoff", "EXPERIENCE_NOM_COURT_cumulativepayoff"] def get_histo_head(): return [le2mtrans(u"Period"), le2mtrans(u"Decision"),
def get_final_text(final_payoff): txt = le2mtrans(u"Your payoff for the experiment is equal to ") + \ u" {}".format(get_pluriel(final_payoff, params.getp("CURRENCY"))) return txt
def main(): parser = argparse.ArgumentParser() # application language: by default the system language parser.add_argument("-l", "--lang", action="store", default=params.getp("LANG"), help=i18n.le2mtrans(u"Language of the application")) # automatic mode: with GUI and random decisions parser.add_argument( "-a", "--automatique", action="store_true", default=False, help=i18n.le2mtrans(u"Run the application in the automatic mode.")) # simulation mode: random decisions without GUI parser.add_argument( "-s", "--simulation", action="store_true", default=False, help=i18n.le2mtrans(u"Run the application in the simulation mode")) # server ip parser.add_argument("-i", "--ip", action="store", default=params.getp("SERVIP"), help=i18n.le2mtrans(u"IP adress of the server")) # server port parser.add_argument("-p", "--port", action="store", type=int, default=params.getp("SERVPORT"), help=i18n.le2mtrans(u"Server port")) # check the options ======================================================== args = parser.parse_args() options = vars(args) params.setp("LANG", args.lang) i18n.install() params.setp("SERVIP", args.ip) params.setp("SERVPORT", args.port) # LOGGER ------------------------------------------------------------------ logger = logging.getLogger("le2m") logger.setLevel(logging.DEBUG) formatter = logging.Formatter( params.getp("LOGGING_FORMATTER"), datefmt=params.getp("LOGGING_FORMATTER_DATE")) # file handler fichier_log = logging.FileHandler( os.path.join(params.getp("REMOTELOGDIR"), 'le2m.log')) fichier_log.setLevel(logging.INFO) fichier_log.setFormatter(formatter) logger.addHandler(fichier_log) # console handler console_log = logging.StreamHandler() console_log.setLevel(logging.DEBUG) console_log.setFormatter(formatter) logger.addHandler(console_log) # first log logger.info(30 * "~") logger.info(u"Logger LE2M created") logger.info("Command ligne options: {}".format(options)) # start remote ------------------------------------------------------------- from client import clt # after appdir and le2mtrans client = clt.Client(args.automatique, args.simulation) client.start()
# -*- coding: utf-8 -*- """ This module contains the texts of the part (server and remote) """ from util.utiltools import get_pluriel import identiteConflitsParams as pms from util.utili18n import le2mtrans import os import configuration.configparam as params import gettext import logging logger = logging.getLogger("le2m") localedir = os.path.join(params.getp("PARTSDIR"), "identiteConflits", "locale") try: trans_IC = gettext.translation( "identiteConflits", localedir, languages=[params.getp("LANG")]).ugettext except IOError: logger.critical(u"Translation file not found") trans_IC = lambda x: x # if there is an error, no translation COM = 0 DIFF = 1 def get_txt_identity(identity): if identity == pms.ID1: return u"jaune" else:
def main(): parser = argparse.ArgumentParser() # application language: by default the system language parser.add_argument( "-l", "--lang", action="store", default=params.getp("LANG"), help=i18n.le2mtrans(u"Language of the application") ) # automatic mode: with GUI and random decisions parser.add_argument( "-a", "--automatique", action="store_true", default=False, help=i18n.le2mtrans(u"Run the application in the automatic mode."), ) # simulation mode: random decisions without GUI parser.add_argument( "-s", "--simulation", action="store_true", default=False, help=i18n.le2mtrans(u"Run the application in the simulation mode"), ) # server ip parser.add_argument( "-i", "--ip", action="store", default=params.getp("SERVIP"), help=i18n.le2mtrans(u"IP adress of the server") ) # server port parser.add_argument( "-p", "--port", action="store", type=int, default=params.getp("SERVPORT"), help=i18n.le2mtrans(u"Server port") ) # check the options ======================================================== args = parser.parse_args() options = vars(args) params.setp("LANG", args.lang) i18n.install() params.setp("SERVIP", args.ip) params.setp("SERVPORT", args.port) # LOGGER ------------------------------------------------------------------ logger = logging.getLogger("le2m") logger.setLevel(logging.DEBUG) formatter = logging.Formatter(params.getp("LOGGING_FORMATTER"), datefmt=params.getp("LOGGING_FORMATTER_DATE")) # file handler fichier_log = logging.FileHandler(os.path.join(params.getp("REMOTELOGDIR"), "le2m.log")) fichier_log.setLevel(logging.INFO) fichier_log.setFormatter(formatter) logger.addHandler(fichier_log) # console handler console_log = logging.StreamHandler() console_log.setLevel(logging.DEBUG) console_log.setFormatter(formatter) logger.addHandler(console_log) # first log logger.info(30 * "~") logger.info(u"Logger LE2M created") logger.info("Command ligne options: {}".format(options)) # start remote ------------------------------------------------------------- from client import clt # after appdir and le2mtrans client = clt.Client(args.automatique, args.simulation) client.start()
# -*- coding: utf-8 -*- """ This module contains the texts of the part (server and remote) """ from util.utiltools import get_pluriel import controlOptimalParams as pms from util.utili18n import le2mtrans import os import configuration.configparam as params import gettext import logging logger = logging.getLogger("le2m") try: localedir = os.path.join(params.getp("PARTSDIR"), "controlOptimal", "locale") trans_CO = gettext.translation("controlOptimal", localedir, languages=[params.getp("LANG")]).ugettext except (AttributeError, IOError): logger.critical(u"Translation file not found") trans_CO = lambda x: x # if there is an error, no translation # ============================================================================== # EXPLANATIONS # ============================================================================== INITIAL_EXTRACTION = trans_CO(u"Please choose an initial extraction level") EXTRACTION = trans_CO(u"Please choose an extraction level")
# -*- coding: utf-8 -*- import oathAndLiesParams as pms import os import configuration.configparam as params import gettext localedir = os.path.join(params.getp("PARTSDIR"), "oathAndLies", "locale") trans_OL = gettext.translation( "oathAndLies", localedir, languages=[params.getp("LANG")]).ugettext def get_histo_header(role): if role == pms.JOUEUR_A: return [u"Lancé de\ndé", u"Votre message\nà B", u"Decision de B", u"Option\nappliquée",u"Gain"] else: return [u"Message de A", u"Votre décision", u"Gain"] def get_text_role(role): return u"Vous êtes joueur {}.".format( u"A" if role == pms.JOUEUR_A else u"B") def get_text_summary(period_content, role): if role == pms.JOUEUR_A: txt = u"Option X: {}, Option Y: {}.".format( pms.CODES_PERIODES[pms.GAME][0], pms.CODES_PERIODES[pms.GAME][1]) txt += u"<br />Résultat du lancé de dé: {}.<br />" \
# -*- coding: utf-8 -*- """ Ce module contient les textes des écrans """ import os import configuration.configparam as params from collections import namedtuple from util.utiltools import get_pluriel import CommonPoolResourceParams as pms import gettext from util.utili18n import le2mtrans localedir = os.path.join(params.getp("PARTSDIR"), "CommonPoolResource", "locale") trans_CPR = gettext.translation("CommonPoolResource", localedir, languages=[params.getp("LANG")]).ugettext TITLE_MSG = namedtuple("TITLE_MSG", "titre message") # MULTI-ECRANS ================================================================= PERIODE_label = lambda periode: trans_CPR(u"Period {}").format(periode) # ECRAN DECISION =============================================================== DECISION_explication = \ trans_CPR(u"You have two accounts: a private account and a public account. " u"The public account has {}. Each group member can extract a maximum " u"of {} from the public account to put on his/her private account. " u"The payoff of each member depends on the number of tokens he/she " u"has put on his/her private account as well as on the total number "
# -*- coding: utf-8 -*- """ This module contains the texts of the part (server and remote) """ from util.utiltools import get_pluriel import MarcheConcurrenceParams as pms from util.utili18n import le2mtrans import os import configuration.configparam as params import gettext import logging logger = logging.getLogger("le2m") localedir = os.path.join(params.getp("PARTSDIR"), "MarcheConcurrence", "locale") try: trans_MC = gettext.translation("MarcheConcurrence", localedir, languages=[params.getp("LANG")]).ugettext except IOError: logger.critical(u"Translation file not found") trans_MC = lambda x: x # if there is an error, no translation def get_histo_vars(role): histo_vars = [ "MC_period", "MC_value_or_cost", "MC_transaction_price", "MC_transaction_prime" ]
# -*- coding: utf-8 -*- from util.utili18n import le2mtrans from util.utiltools import get_pluriel import prisonnersDilemmaParams as pms import os import configuration.configparam as params import gettext localedir = os.path.join(params.getp("PARTSDIR"), "prisonnersDilemma", "locale") trans_DP = gettext.translation("prisonnersDilemma", localedir, languages=[params.getp("LANG")]).ugettext def get_text_explanation(): return trans_DP(u"Choose option X or option Y") def get_histo_head(): return [le2mtrans(u"Period"), le2mtrans(u"Decision"), trans_DP(u"Decision other"), le2mtrans(u"Period\npayoff"), le2mtrans(u"Cumulative\npayoff")] def get_text_summary(period_content): txt = trans_DP(u"You chose {} and the other player chose {}.").format( pms.get_option(period_content.get("DP_decision")), pms.get_option(period_content.get("DP_decisionother"))) txt += u" " + trans_DP(u"Your payoff is {}.").format( get_pluriel(period_content.get("DP_periodpayoff"), pms.MONNAIE))
# -*- coding: utf-8 -*- """ This module contains the texts of the part (server and remote) """ from util.utiltools import get_pluriel import EXPERIENCE_NOMParams as pms from util.utili18n import le2mtrans import os import configuration.configparam as params import gettext localedir = os.path.join(params.getp("PARTSDIR"), "EXPERIENCE_NOM", "locale") trans_EXPERIENCE_NOM_COURT = gettext.translation( "EXPERIENCE_NOM", localedir, languages=[params.getp("LANG")]).ugettext def get_histo_head(): return [le2mtrans(u"Period"), le2mtrans(u"Decision"), le2mtrans(u"Period\npayoff"), le2mtrans(u"Cumulative\npayoff")] def get_text_explanation(): return trans_EXPERIENCE_NOM_COURT(u"") def get_text_summary(period_content): txt = trans_EXPERIENCE_NOM_COURT(u"Summary text") return txt
# -*- coding: utf-8 -*- """ Ce module contient les textes des écrans """ import os import configuration.configparam as params from collections import namedtuple from util.utiltools import get_pluriel import CommonPoolResourceParams as pms import gettext from util.utili18n import le2mtrans localedir = os.path.join( params.getp("PARTSDIR"), "CommonPoolResource", "locale") trans_CPR = gettext.translation( "CommonPoolResource", localedir, languages=[params.getp("LANG")]).ugettext TITLE_MSG = namedtuple("TITLE_MSG", "titre message") # MULTI-ECRANS ================================================================= PERIODE_label = lambda periode: trans_CPR(u"Period {}").format(periode) # ECRAN DECISION =============================================================== DECISION_explication = \ trans_CPR(u"You have two accounts: a private account and a public account. " u"The public account has {}. Each group member can extract a maximum " u"of {} from the public account to put on his/her private account. " u"The payoff of each member depends on the number of tokens he/she "
# -*- coding: utf-8 -*- """ This module contains the texts of the part (server and remote) """ from util.utiltools import get_pluriel import relativesRelationshipsParams as pms from util.utili18n import le2mtrans import os import configuration.configparam as params import gettext import logging logger = logging.getLogger("le2m") localedir = os.path.join(params.getp("PARTSDIR"), "relativesRelationships", "locale") try: trans_RR = gettext.translation( "relativesRelationships", localedir, languages=[params.getp("LANG")]).ugettext except IOError: logger.critical(u"Translation file not found") trans_RR = lambda x: x # if there is an error, no translation def get_text_explanation(): return trans_RR(u"Pour chacun des 30 énoncés (répartis sur 6 pages), " u"veuillez cliquer sur le numéro de l'échelle " u"(de 1=pas du tout d'accord à 5=tout à fait d'accord) " u"qui décrit le mieux la façon dont l'énoncé s'applique " u"à vous et votre mère (à gauche), à vous et à votre père " u"(à droite) durant les années où vous avez grandi à la " u"maison. Il n'y a pas de bonne ou de mauvaise réponse. "
# -*- coding: utf-8 -*- """ Ce module contient les textes des écrans """ __author__ = "Dimitri DUBOIS" import os from collections import OrderedDict import configuration.configparam as params import gettext localedir = os.path.join(params.getp("PARTSDIR"), "Dictator", "locale") trans_DIC = gettext.translation("Dictator", localedir, languages=[params.getp("LANG")], fallback=True).ugettext from collections import namedtuple from util.utiltools import get_pluriel from parts.Dictator import DictatorParams as pms import logging logger = logging.getLogger("le2m") TITLE_MSG = namedtuple("TITLE_MSG", "titre message") # HISTO ======================================================================== histo_build = {} def get_histo_build(role): global histo_build if not histo_build.get(role): hb = OrderedDict()
# -*- coding: utf-8 -*- __author__ = "Dimitri DUBOIS" import os import gettext import configuration.configparam as params localedir = os.path.join(params.getp("APPDIR"), "locale") le2mtrans = None def install(): global le2mtrans try: le2mtrans = gettext.translation("le2m", localedir, languages=[params.getp("LANG") ]).ugettext except IOError: le2mtrans = gettext.translation("le2m", localedir).ugettext install()
# -*- coding: utf-8 -*- """ This module contains the texts of the part (server and remote) """ from util.utiltools import get_pluriel import dynamicCPRParams as pms from util.utili18n import le2mtrans import os import configuration.configparam as params import gettext import logging logger = logging.getLogger("le2m") try: localedir = os.path.join(params.getp("PARTSDIR"), "dynamicCPR", "locale") trans_DYNCPR = gettext.translation( "dynamicCPR", localedir, languages=[params.getp("LANG")]).ugettext except (AttributeError, IOError): logger.critical(u"Translation file not found") trans_DYNCPR = lambda x: x # if there is an error, no translation # ============================================================================== # EXPLANATIONS # ============================================================================== INITIAL_EXTRACTION = trans_DYNCPR( u"Please choose an initial extraction value")
# -*- coding: utf-8 -*- from util.utili18n import le2mtrans from util.utiltools import get_pluriel import prisonnersDilemmaParams as pms import os import configuration.configparam as params import gettext localedir = os.path.join(params.getp("PARTSDIR"), "prisonnersDilemma", "locale") trans_DP = gettext.translation("prisonnersDilemma", localedir, languages=[params.getp("LANG")]).ugettext def get_text_explanation(): return trans_DP(u"Choose option X or option Y") def get_histo_head(): return [ le2mtrans(u"Period"), le2mtrans(u"Decision"), trans_DP(u"Decision other"), le2mtrans(u"Period\npayoff"), le2mtrans(u"Cumulative\npayoff") ] def get_text_summary(period_content):
# -*- coding: utf-8 -*- from __future__ import unicode_literals from util.utili18n import le2mtrans from util.utiltools import get_pluriel import PublicGoodGameSolidarityParams as pms import os import configuration.configparam as params import gettext try: localedir = os.path.join(params.getp("PARTSDIR"), "PublicGoodGameSolidarity", "locale") trans_PGGS = gettext.translation("PublicGoodGameSolidarity", localedir, languages=[params.getp("LANG")]).ugettext except (AttributeError, IOError): trans_PGGS = lambda x: x VOTES = { pms.IN_FAVOR: trans_PGGS(u"In favor of"), pms.AGAINST: trans_PGGS(u"Against") } POLITICS = { 0: u"Extrême gauche", 1: u"Gauche", 2: u"Centre", 3: u"Droite", 4: u"Extrême droite" }
# -*- coding: utf-8 -*- """ Ce module contient les textes des écrans """ __author__ = "Dimitri DUBOIS" import os import configuration.configparam as params from collections import namedtuple from util.utiltools import get_pluriel import PublicGoodGameParams as pms import gettext localedir = os.path.join(params.getp("PARTSDIR"), "PublicGoodGame", "locale") trans_PGG = gettext.translation( "PublicGoodGame", localedir, languages=[params.getp("LANG")]).ugettext TITLE_MSG = namedtuple("TITLE_MSG", "titre message") def get_histo_head(): return [trans_PGG(u"Period"), trans_PGG(u"Individual\naccount"), trans_PGG(u"Public\naccount"), trans_PGG(u"Public\naccount\ngroup"), trans_PGG(u"Period\npayoff"), trans_PGG(u"Cumulative\npayoff")] def get_text_explanation(): return trans_PGG(u"You have an endowment of {} tokens.").format(pms.DOTATION)
# -*- coding: utf-8 -*- """ This module contains the texts for the screens """ from util.utiltools import get_pluriel import TeamCommunicationParams as pms import os import configuration.configparam as params import gettext from util.utili18n import le2mtrans localedir = os.path.join(params.getp("PARTSDIR"), "TeamCommunication", "locale") trans_TC = gettext.translation( "TeamCommunication", localedir, languages=[params.getp("LANG")]).ugettext COUNTRY_RESIDENCE = { 1: trans_TC(u"Germany"), 2: trans_TC(u"Belgium"), 3: trans_TC(u"France"), 4: trans_TC(u"Luxembourg") } LANGUAGE_SKILLS = { 1: trans_TC(u"No difficulty"), 2: trans_TC(u"Some difficulty"), 3: trans_TC(u"Considerable difficulty"), 4: trans_TC(u"No notion") }
def main(): parser = argparse.ArgumentParser() # application language parser.add_argument("-l", "--lang", action="store", default=params.getp("LANG"), help=i18n.le2mtrans(u"Language of the application")) # directory for the database parser.add_argument("-db", "--dirbase", action="store", default=None, help=i18n.le2mtrans( u"Directory in which to store the database. " u"This argument is not an option if several " u"parts are started with arg -e")) # database name parser.add_argument( "-nb", "--namebase", action="store", default="data.sqlite", help=i18n.le2mtrans(u"Name of the sqlite file, if not data")) # server port parser.add_argument("-p", "--port", action="store", type=int, default=params.getp("SERVPORT")) # names of parts to load directly parser.add_argument( "-e", "--parts", nargs='+', default=[], dest="parts", help=i18n.le2mtrans(u"The name(s) of the part(s) to load).")) # whether it is a test session or not test_parser = parser.add_mutually_exclusive_group(required=False) test_parser.add_argument('--test', dest='test', action='store_true', help=i18n.le2mtrans(u"The session is launched in " u"test mode")) test_parser.add_argument('--no-test', dest='test', action='store_false', help=i18n.le2mtrans( u"The session is launched for " u"real (not test mode)")) parser.set_defaults(test=True) # check the options ======================================================== args = parser.parse_args() params.setp("LANG", args.lang) i18n.install() if args.parts: for e in args.parts: if e not in os.listdir(params.getp("PARTSDIR")): parser.error( i18n.le2mtrans(u"Part {} does not exist").format(e)) # check database if several parts if len(args.parts) > 1 and not args.dirbase: parser.error( i18n.le2mtrans( u"The directory in which store the database has to be provided " u"with arg -db")) params.setp("SERVPORT", args.port) options = vars(args) # we put the args in a dict # creation logger ========================================================== logger = logging.getLogger("le2m") logger.setLevel(logging.DEBUG) formatter = logging.Formatter( params.getp("LOGGING_FORMATTER"), datefmt=params.getp("LOGGING_FORMATTER_DATE")) fichier_log = logging.FileHandler( os.path.join(params.getp("LOGDIR"), 'le2m.log')) fichier_log.setLevel(logging.INFO) fichier_log.setFormatter(formatter) logger.addHandler(fichier_log) console_log = logging.StreamHandler() console_log.setLevel(logging.DEBUG) console_log.setFormatter(formatter) logger.addHandler(console_log) logger.info(60 * "=") logger.info("Logger LE2M created") logger.info("APPDIR: {}".format(params.getp("APPDIR"))) logger.info("PARTSDIR: {}".format(params.getp("PARTSDIR"))) logger.info("Command line options: {}".format(options)) # start server ------------------------------------------------------------- from server.serv import Serveur serveur = Serveur(**options) serveur.start()
def main(): parser = argparse.ArgumentParser() # application language parser.add_argument("-l", "--lang", action="store", default=params.getp("LANG"), help=i18n.le2mtrans(u"Language of the application")) # directory for the database parser.add_argument("-db", "--dirbase", action="store", default=None, help=i18n.le2mtrans( u"Directory in which to store the database. " u"This argument is not an option if several " u"parts are started with arg -e")) # database name parser.add_argument("-nb", "--namebase", action="store", default="data.sqlite", help=i18n.le2mtrans(u"Name of the sqlite file, if not data")) # server port parser.add_argument("-p", "--port", action="store", type=int, default=params.getp("SERVPORT")) # names of parts to load directly parser.add_argument("-e", "--parts", nargs='+', default=[], dest="parts", help=i18n.le2mtrans(u"The name(s) of the part(s) to load).")) # whether it is a test session or not test_parser = parser.add_mutually_exclusive_group(required=False) test_parser.add_argument('--test', dest='test', action='store_true', help=i18n.le2mtrans(u"The session is launched in " u"test mode")) test_parser.add_argument('--no-test', dest='test', action='store_false', help=i18n.le2mtrans(u"The session is launched for " u"real (not test mode)")) parser.set_defaults(test=True) # parser.add_argument("-nt", "--notest", action="store_false", default=True, # help=i18n.le2mtrans( # u"With this option the experiment is launched for " # u"real")) # check the options ======================================================== args = parser.parse_args() params.setp("LANG", args.lang) i18n.install() if args.parts: for e in args.parts: if e not in os.listdir(params.getp("PARTSDIR")): parser.error(i18n.le2mtrans(u"Part {p} does not exist").format(p=e)) # check database if several parts if len(args.parts) > 1 and not args.dirbase: parser.error(i18n.le2mtrans( u"The directory in which store the database has to be provided " u"with arg -db")) params.setp("SERVPORT", args.port) options = vars(args) # we put the args in a dict # creation logger ========================================================== logger = logging.getLogger("le2m") logger.setLevel(logging.DEBUG) formatter = logging.Formatter( params.getp("LOGGING_FORMATTER"), datefmt=params.getp("LOGGING_FORMATTER_DATE")) fichier_log = logging.FileHandler( os.path.join(params.getp("LOGDIR"), 'le2m.log')) fichier_log.setLevel(logging.INFO) fichier_log.setFormatter(formatter) logger.addHandler(fichier_log) console_log = logging.StreamHandler() console_log.setLevel(logging.DEBUG) console_log.setFormatter(formatter) logger.addHandler(console_log) logger.info(30 * "=") logger.info("Logger LE2M created") logger.info("APPDIR: {}".format(params.getp("APPDIR"))) logger.info("PARTSDIR: {}".format(params.getp("PARTSDIR"))) logger.info("Command ligne options: {}".format(options)) # start server ------------------------------------------------------------- from server.serv import Serveur serveur = Serveur(**options) serveur.start()
# -*- coding: utf-8 -*- """ This module contains the texts of the part (server and remote) """ from util.utiltools import get_pluriel import socialvalueorientationParams as pms from util.utili18n import le2mtrans import os import configuration.configparam as params import gettext import logging logger = logging.getLogger("le2m") try: localedir = os.path.join(params.getp("PARTSDIR"), "socialvalueorientation", "locale") trans_SVO = gettext.translation( "socialvalueorientation", localedir, languages=[params.getp("LANG")]).ugettext except (AttributeError, IOError): logger.critical(u"Translation file not found") trans_SVO = lambda x: x # if there is an error, no translation def get_text_explanation(): return u"Vous devez décider de la répartition d'une somme d’argent entre " \ u"vous et une personne de la salle. Vous ne pouvez pas identifier " \ u"l'autre personne et elle ne peut pas vous identifier. Il n’y a pas " \ u"de bonne ou de mauvaise réponse, et les données seront traitées " \ u"de manière anonyme. Pour chacune des 15 questions, " \ u"indiquez la répartition que vous préférez en " \
# -*- coding: utf-8 -*- import oathAndLiesParams as pms import os import configuration.configparam as params import gettext localedir = os.path.join(params.getp("PARTSDIR"), "oathAndLies", "locale") trans_OL = gettext.translation("oathAndLies", localedir, languages=[params.getp("LANG")]).ugettext def get_histo_header(role): if role == pms.JOUEUR_A: return [ u"Lancé de\ndé", u"Votre message\nà B", u"Decision de B", u"Option\nappliquée", u"Gain" ] else: return [u"Message de A", u"Votre décision", u"Gain"] def get_text_role(role): return u"Vous êtes joueur {}.".format(u"A" if role == pms.JOUEUR_A else u"B") def get_text_summary(period_content, role): if role == pms.JOUEUR_A: txt = u"Option X: {}, Option Y: {}.".format(