[virtualcommons-developer] commit/vcweb: alllee: adding GroupCluster logic to round ended for calcu
Status: Beta
Brought to you by:
alllee
|
From: <com...@bi...> - 2013-03-22 22:42:55
|
1 new commit in vcweb: https://bitbucket.org/virtualcommons/vcweb/commits/b1d317629544/ Changeset: b1d317629544 User: alllee Date: 2013-03-22 23:42:55 Summary: adding GroupCluster logic to round ended for calculating harvest decision / conservation decision bonuses Affected #: 3 files diff -r c8198aae5658342c84413233ce304daeedf8f077 -r b1d31762954466199f86eda7e502069c46f99c62 vcweb/broker/models.py --- a/vcweb/broker/models.py +++ b/vcweb/broker/models.py @@ -1,8 +1,8 @@ from django.db import models from django.dispatch import receiver from vcweb.core import signals, simplecache -from vcweb.core.models import Parameter, ParticipantRoundDataValue -from vcweb.forestry.models import get_harvest_decision_parameter, set_harvest_decision +from vcweb.core.models import (Parameter, ParticipantRoundDataValue, GroupCluster) +from vcweb.forestry.models import get_harvest_decision_parameter, set_harvest_decision, get_harvest_decision import logging logger = logging.getLogger(__name__) @@ -39,6 +39,10 @@ def get_group_local_bonus_threshold_parameter(): return Parameter.objects.get(name='group_local_bonus_threshold') +def get_conservation_decision(participant_group_relationship, round_data=None): + return participant_group_relationship.get_data_value(parameter=get_conservation_decision_parameter(), + round_data=round_data, default=0).int_value + def set_conservation_decision(participant_group_relationship, value, round_data=None): if round_data is None: round_data = participant_group_relationship.current_round_data @@ -48,6 +52,12 @@ prdv.int_value = value prdv.save() +def get_group_local_bonus_threshold(round_configuration): + return round_configuration.get_parameter_value(parameter=get_group_local_bonus_parameter(), default=5).int_value + +def get_group_cluster_bonus_threshold(round_configuration): + return round_configuration.get_parameter_value(parameter=get_group_cluster_bonus_parameter(), default=22).int_value + @receiver(signals.round_started, sender=EXPERIMENT_METADATA_NAME) def round_started_handler(sender, experiment=None, **kwargs): if experiment is None: @@ -70,3 +80,22 @@ ''' current_round_configuration = experiment.current_round logger.debug("ending boundaries round: %s", current_round_configuration) + round_data = experiment.current_round_data + if current_round_configuration.is_playable_round: + local_threshold = get_group_local_bonus_threshold(current_round_configuration) + group_cluster_threshold = get_group_cluster_bonus_threshold(current_round_configuration) + for group_cluster in GroupCluster.objects.for_experiment(experiment): + group_cluster_conservation_hours = 0 + for group_relationship in group_cluster.group_relationship_set.all(): + group_conservation_hours = 0 + group = group_relationship.group + for pgr in group.participant_group_relationship_set.all(): + conservation_hours = get_conservation_decision(pgr, round_data=round_data) + group_conservation_hours += conservation_hours + # calculate local group conservation bonus + local_bonus = calculate_group_local_bonus(group_conservation_hours, local_threshold) + group.set_data_value(parameter=get_group_local_bonus_parameter(), value=local_bonus) + group_cluster_conservation_hours += group_conservation_hours + group_cluster_bonus = calculate_group_cluster_bonus(group_cluster_conservation_hours, + group_cluster_threshold) + group_cluster.set_data_value(parameter=get_group_cluster_bonus_parameter(), value=group_cluster_bonus) diff -r c8198aae5658342c84413233ce304daeedf8f077 -r b1d31762954466199f86eda7e502069c46f99c62 vcweb/broker/views.py --- a/vcweb/broker/views.py +++ b/vcweb/broker/views.py @@ -8,7 +8,8 @@ ParticipantExperimentRelationship, RoundConfiguration, ChatMessage, ParticipantRoundDataValue) from vcweb.broker.models import (get_max_harvest_hours, get_harvest_decision_parameter, - get_conservation_decision_parameter, set_harvest_decision, set_conservation_decision) + get_conservation_decision_parameter, set_harvest_decision, set_conservation_decision, get_harvest_decision, + get_conservation_decision) import random @@ -60,6 +61,7 @@ group = participant_group_relationship.group experiment_configuration = experiment.experiment_configuration round_configuration = experiment.current_round + previous_round_data = experiment.get_round_data(round_configuration=experiment.previous_round) round_data = experiment.current_round_data # experiment configuration data @@ -97,7 +99,8 @@ experiment_model_dict['globalThreshold'] = group.get_data_value(parameter_name='group_cluster_bonus_threshold', round_data=round_data, default=22).int_value # data from the last round - experiment_model_dict['lastRoundHarvestDecision'] = 5 + experiment_model_dict['lastRoundHarvestDecision'] = get_harvest_decision(participant_group_relationship, round_data=previous_round_data) + experiment_model_dict['lastRoundConservationDecision'] = get_conservation_decision(participant_group_relationship, round_data=previous_round_data) experiment_model_dict['lastRoundMyGroupConservation'] = 10 experiment_model_dict['lastRoundGlobalConservation'] = 10 experiment_model_dict['lastRoundGroupLocalBonus'] = 10 diff -r c8198aae5658342c84413233ce304daeedf8f077 -r b1d31762954466199f86eda7e502069c46f99c62 vcweb/core/models.py --- a/vcweb/core/models.py +++ b/vcweb/core/models.py @@ -1532,15 +1532,31 @@ class Meta: ordering = ['experiment', 'number'] +class GroupClusterQuerySet(models.query.QuerySet): + def for_experiment(self, experiment, **kwargs): + return self.prefetch_related('group_relationship_set').filter(experiment=experiment, **kwargs) + class GroupCluster(models.Model): date_created = models.DateTimeField(default=datetime.now) name = models.CharField(max_length=64, null=True, blank=True) session_id = models.CharField(max_length=64, null=True, blank=True) experiment = models.ForeignKey(Experiment) + objects = PassThroughManager.for_queryset_class(GroupClusterQuerySet)() + def add(self, group): return GroupRelationship.objects.create(cluster=self, group=group) + def set_data_value(self, parameter=None, value=None, round_data=None): + if parameter is None or value is None: + raise ValueError("need a parameter and value to set") + if round_data is None: + round_data = self.experiment.current_round_data +# FIXME: this should follow the get / set style of the other setters, but we're not initializing cluster data values yet + return GroupClusterDataValue.objects.create(group_cluster=self, + round_data=round_data, value=value, parameter=parameter) + + def __unicode__(self): return u"group cluster %s (%s)" % (self.name, self.experiment) Repository URL: https://bitbucket.org/virtualcommons/vcweb/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. |