virtualcommons-svn Mailing List for Virtual Commons Experiment Software (Page 8)
Status: Beta
Brought to you by:
alllee
You can subscribe to this list here.
2008 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
(1) |
Jul
(21) |
Aug
(31) |
Sep
(6) |
Oct
(15) |
Nov
(2) |
Dec
(9) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2009 |
Jan
(4) |
Feb
(6) |
Mar
(12) |
Apr
(52) |
May
(14) |
Jun
(19) |
Jul
(81) |
Aug
(115) |
Sep
(36) |
Oct
(88) |
Nov
(46) |
Dec
(58) |
2010 |
Jan
(52) |
Feb
(55) |
Mar
(48) |
Apr
(15) |
May
(5) |
Jun
(38) |
Jul
(27) |
Aug
(24) |
Sep
(28) |
Oct
(1) |
Nov
(2) |
Dec
(29) |
2011 |
Jan
(87) |
Feb
(39) |
Mar
(63) |
Apr
(42) |
May
(26) |
Jun
(53) |
Jul
(23) |
Aug
(43) |
Sep
(37) |
Oct
(25) |
Nov
(4) |
Dec
(7) |
2012 |
Jan
(73) |
Feb
(79) |
Mar
(62) |
Apr
(28) |
May
(12) |
Jun
(2) |
Jul
(9) |
Aug
(1) |
Sep
(8) |
Oct
|
Nov
(3) |
Dec
(3) |
2013 |
Jan
(8) |
Feb
(16) |
Mar
(38) |
Apr
(74) |
May
(62) |
Jun
(15) |
Jul
(49) |
Aug
(19) |
Sep
(9) |
Oct
|
Nov
|
Dec
|
2014 |
Jan
|
Feb
|
Mar
|
Apr
(2) |
May
(25) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: <com...@bi...> - 2013-05-01 22:07:08
|
2 new commits in vcweb: https://bitbucket.org/virtualcommons/vcweb/commits/e163ed0bcad8/ Changeset: e163ed0bcad8 User: alllee Date: 2013-05-01 23:54:48 Summary: fixing bug in lighterprints api login Affected #: 2 files diff -r 82bc16b1b4e9ff4bbc4a554bb8ab14577b42821c -r e163ed0bcad882df6fc02f405f417f0c2953b816 vcweb/core/tests.py --- a/vcweb/core/tests.py +++ b/vcweb/core/tests.py @@ -48,7 +48,7 @@ @property def participant_group_relationships(self): - return ParticipantGroupRelationship.objects.filter(group__experiment=self.experiment) + return self.experiment.participant_group_relationships def create_new_experiment(self, experiment_metadata, experimenter=None): if experimenter is None: diff -r 82bc16b1b4e9ff4bbc4a554bb8ab14577b42821c -r e163ed0bcad882df6fc02f405f417f0c2953b816 vcweb/lighterprints/views.py --- a/vcweb/lighterprints/views.py +++ b/vcweb/lighterprints/views.py @@ -278,7 +278,7 @@ participant = user.participant # FIXME: defaulting to first active experiment... need to revisit this. active_experiment = get_active_experiment(participant, experiment_metadata=get_lighterprints_experiment_metadata()) - participant_group_relationship = participant.get_participant_group_relationship(active_experiment) + participant_group_relationship = active_experiment.get_participant_group_relationship(participant) return JsonResponse(dumps({'success': True, 'participant_group_id': participant_group_relationship.id})) else: logger.debug("invalid form %s", form) https://bitbucket.org/virtualcommons/vcweb/commits/5812d8de0878/ Changeset: 5812d8de0878 User: alllee Date: 2013-05-02 00:07:02 Summary: moving /lighterprints/api/login to /api/login (for participants only) refactor eventually, merge with LoginView / LogoutView Affected #: 4 files diff -r e163ed0bcad882df6fc02f405f417f0c2953b816 -r 5812d8de087899fbe9a7a2b5078b7436a5fc80f3 vcweb/core/urls.py --- a/vcweb/core/urls.py +++ b/vcweb/core/urls.py @@ -3,7 +3,8 @@ from vcweb import settings from vcweb.core.views import (Dashboard, LoginView, LogoutView, RegistrationView, monitor, CloneExperimentView, RegisterEmailListView, RegisterTestParticipantsView, ClearParticipantsExperimentView, add_experiment, - Participate, download_data, export_configuration, api_logger, participant_ready, get_number_of_ready_participants, deactivate) + Participate, download_data, export_configuration, api_logger, participant_api_login, api_logout, + participant_ready, get_number_of_ready_participants, deactivate) import logging import urllib @@ -35,6 +36,8 @@ # experiment controller actions are the most general, needs to be matched at the very end # deliberately match any prefix to api/2525/log url(r'api/log/(?P<participant_group_id>\d+)$', api_logger, name='api-logger'), + url(r'api/login', participant_api_login, name='participant_api_login'), + url(r'api/logout', api_logout, name='api_logout'), ) def foursquare_auth_dict(**kwargs): diff -r e163ed0bcad882df6fc02f405f417f0c2953b816 -r 5812d8de087899fbe9a7a2b5078b7436a5fc80f3 vcweb/core/views.py --- a/vcweb/core/views.py +++ b/vcweb/core/views.py @@ -129,6 +129,33 @@ return pers[0].experiment return None +# FIXME: merge these with LogoutView / LoginView +def api_logout(request): + user = request.user + set_authentication_token(user) + auth.logout(request) + return JsonResponse(dumps({'success': True})) + +# FIXME: assumes participant login +def participant_api_login(request): + form = LoginForm(request.POST or None) + try: + if form.is_valid(): + user = form.user_cache + logger.debug("user was authenticated as %s, attempting to login", user) + auth.login(request, user) + set_authentication_token(user, request.session.session_key) + participant = user.participant +# FIXME: defaulting to first active experiment... need to revisit this. + active_experiment = get_active_experiment(participant) + participant_group_relationship = active_experiment.get_participant_group_relationship(participant) + return JsonResponse(dumps({'success': True, 'participant_group_id': participant_group_relationship.pk})) + else: + logger.debug("invalid form %s", form) + except Exception as e: + logger.debug("Invalid login: %s", e) + return JsonResponse(dumps({'success': False, 'message': "Invalid login"})) + class LoginView(FormView, AnonymousMixin): form_class = LoginForm diff -r e163ed0bcad882df6fc02f405f417f0c2953b816 -r 5812d8de087899fbe9a7a2b5078b7436a5fc80f3 vcweb/lighterprints/urls.py --- a/vcweb/lighterprints/urls.py +++ b/vcweb/lighterprints/urls.py @@ -1,7 +1,7 @@ from django.conf.urls.defaults import url, patterns from django.views.generic.base import TemplateView -from vcweb.lighterprints.views import (post_chat_message, post_comment, perform_activity, login, participate, +from vcweb.lighterprints.views import (post_chat_message, post_comment, perform_activity, participate, group_activity, like, get_notifications, update_notifications_since, group_score, CsvExportView, checkin, activity_performed_counts, get_view_model, mobile_participate) @@ -16,7 +16,6 @@ url(r'^api/message', post_chat_message), url(r'^api/comment', post_comment), url(r'^api/like', like), - url(r'^api/login', login), url(r'^api/group-score/(?P<participant_group_id>\d+)', group_score), url(r'^api/notifications/clear', update_notifications_since), url(r'^api/notifications/(?P<participant_group_id>\d+)', get_notifications), diff -r e163ed0bcad882df6fc02f405f417f0c2953b816 -r 5812d8de087899fbe9a7a2b5078b7436a5fc80f3 vcweb/lighterprints/views.py --- a/vcweb/lighterprints/views.py +++ b/vcweb/lighterprints/views.py @@ -1,21 +1,19 @@ from datetime import datetime, timedelta -from django.contrib import auth from django.contrib.auth.decorators import login_required from django.core.exceptions import PermissionDenied -from django.http import HttpResponse, Http404 -from django.shortcuts import get_object_or_404, render, redirect -from django.utils.html import escape +from django.http import Http404 +from django.shortcuts import get_object_or_404, render from django.views.decorators.csrf import csrf_exempt -from django.views.generic.detail import DetailView, BaseDetailView +from django.views.generic.detail import BaseDetailView from django.views.generic.list import BaseListView, MultipleObjectTemplateResponseMixin from vcweb.core import unicodecsv from vcweb.core.decorators import participant_required -from vcweb.core.forms import (ChatForm, LoginForm, CommentForm, LikeForm, ParticipantGroupIdForm, GeoCheckinForm) +from vcweb.core.forms import (ChatForm, CommentForm, LikeForm, ParticipantGroupIdForm, GeoCheckinForm) from vcweb.core.http import JsonResponse from vcweb.core.models import (ChatMessage, Comment, Experiment, ParticipantGroupRelationship, ParticipantRoundDataValue, Like) from vcweb.core.services import foursquare_venue_search -from vcweb.core.views import JSONResponseMixin, DataExportMixin, dumps, set_authentication_token, json_response, get_active_experiment +from vcweb.core.views import JSONResponseMixin, DataExportMixin, dumps, json_response from vcweb.lighterprints.forms import ActivityForm from vcweb.lighterprints.models import (Activity, get_all_activities_tuple, do_activity, get_group_activity, can_view_other_groups, get_lighterprints_experiment_metadata, is_experiment_completed, @@ -266,26 +264,6 @@ logger.debug("invalid form: %s from request: %s", form, request) return JsonResponse(dumps({'success': False, 'message': 'Invalid post comment'})) -@csrf_exempt -def login(request): - form = LoginForm(request.POST or None) - try: - if form.is_valid(): - user = form.user_cache - logger.debug("user was authenticated as %s, attempting to login", user) - auth.login(request, user) - set_authentication_token(user, request.session.session_key) - participant = user.participant -# FIXME: defaulting to first active experiment... need to revisit this. - active_experiment = get_active_experiment(participant, experiment_metadata=get_lighterprints_experiment_metadata()) - participant_group_relationship = active_experiment.get_participant_group_relationship(participant) - return JsonResponse(dumps({'success': True, 'participant_group_id': participant_group_relationship.id})) - else: - logger.debug("invalid form %s", form) - except Exception as e: - logger.debug("Invalid login: %s", e) - return JsonResponse(dumps({'success': False, 'message': "Invalid login"})) - class CsvExportView(DataExportMixin, BaseDetailView): def export_data(self, response, experiment): logger.debug("exporting data for %s", 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. |
From: <com...@bi...> - 2013-05-01 20:17:31
|
1 new commit in vcweb: https://bitbucket.org/virtualcommons/vcweb/commits/82bc16b1b4e9/ Changeset: 82bc16b1b4e9 User: RoleeSinha Date: 2013-05-01 22:17:04 Summary: lighterprints mobile Affected #: 31 files diff -r 48e31ed50bba14b37ecfbbb9852b378fd521bd67 -r 82bc16b1b4e9ff4bbc4a554bb8ab14577b42821c vcweb/lighterprints/templates/lighterprints/mobile/font-awesome/README.md --- /dev/null +++ b/vcweb/lighterprints/templates/lighterprints/mobile/font-awesome/README.md @@ -0,0 +1,4 @@ +Font Awesome, the iconic font designed for use with Twitter Bootstrap + +The full suite of pictographic icons, examples, and documentation can be found at: +http://fortawesome.github.com/Font-Awesome/ diff -r 48e31ed50bba14b37ecfbbb9852b378fd521bd67 -r 82bc16b1b4e9ff4bbc4a554bb8ab14577b42821c vcweb/lighterprints/templates/lighterprints/mobile/font-awesome/faicons-v2.png Binary file vcweb/lighterprints/templates/lighterprints/mobile/font-awesome/faicons-v2.png has changed diff -r 48e31ed50bba14b37ecfbbb9852b378fd521bd67 -r 82bc16b1b4e9ff4bbc4a554bb8ab14577b42821c vcweb/lighterprints/templates/lighterprints/mobile/font-awesome/faicons.png Binary file vcweb/lighterprints/templates/lighterprints/mobile/font-awesome/faicons.png has changed diff -r 48e31ed50bba14b37ecfbbb9852b378fd521bd67 -r 82bc16b1b4e9ff4bbc4a554bb8ab14577b42821c vcweb/lighterprints/templates/lighterprints/mobile/font-awesome/font/FontAwesome.otf Binary file vcweb/lighterprints/templates/lighterprints/mobile/font-awesome/font/FontAwesome.otf has changed diff -r 48e31ed50bba14b37ecfbbb9852b378fd521bd67 -r 82bc16b1b4e9ff4bbc4a554bb8ab14577b42821c vcweb/lighterprints/templates/lighterprints/mobile/font-awesome/font/fontawesome-webfont.eot Binary file vcweb/lighterprints/templates/lighterprints/mobile/font-awesome/font/fontawesome-webfont.eot has changed diff -r 48e31ed50bba14b37ecfbbb9852b378fd521bd67 -r 82bc16b1b4e9ff4bbc4a554bb8ab14577b42821c vcweb/lighterprints/templates/lighterprints/mobile/font-awesome/font/fontawesome-webfont.ttf Binary file vcweb/lighterprints/templates/lighterprints/mobile/font-awesome/font/fontawesome-webfont.ttf has changed diff -r 48e31ed50bba14b37ecfbbb9852b378fd521bd67 -r 82bc16b1b4e9ff4bbc4a554bb8ab14577b42821c vcweb/lighterprints/templates/lighterprints/mobile/font-awesome/font/fontawesome-webfont.woff Binary file vcweb/lighterprints/templates/lighterprints/mobile/font-awesome/font/fontawesome-webfont.woff has changed diff -r 48e31ed50bba14b37ecfbbb9852b378fd521bd67 -r 82bc16b1b4e9ff4bbc4a554bb8ab14577b42821c vcweb/lighterprints/templates/lighterprints/mobile/font-awesome/images/ajax-loader.png Binary file vcweb/lighterprints/templates/lighterprints/mobile/font-awesome/images/ajax-loader.png has changed diff -r 48e31ed50bba14b37ecfbbb9852b378fd521bd67 -r 82bc16b1b4e9ff4bbc4a554bb8ab14577b42821c vcweb/lighterprints/templates/lighterprints/mobile/font-awesome/images/icons-18-black-pack.png Binary file vcweb/lighterprints/templates/lighterprints/mobile/font-awesome/images/icons-18-black-pack.png has changed diff -r 48e31ed50bba14b37ecfbbb9852b378fd521bd67 -r 82bc16b1b4e9ff4bbc4a554bb8ab14577b42821c vcweb/lighterprints/templates/lighterprints/mobile/font-awesome/images/icons-18-white-pack.png Binary file vcweb/lighterprints/templates/lighterprints/mobile/font-awesome/images/icons-18-white-pack.png has changed diff -r 48e31ed50bba14b37ecfbbb9852b378fd521bd67 -r 82bc16b1b4e9ff4bbc4a554bb8ab14577b42821c vcweb/lighterprints/templates/lighterprints/mobile/font-awesome/images/icons-36-black-pack.png Binary file vcweb/lighterprints/templates/lighterprints/mobile/font-awesome/images/icons-36-black-pack.png has changed diff -r 48e31ed50bba14b37ecfbbb9852b378fd521bd67 -r 82bc16b1b4e9ff4bbc4a554bb8ab14577b42821c vcweb/lighterprints/templates/lighterprints/mobile/font-awesome/images/icons-36-white-pack.png Binary file vcweb/lighterprints/templates/lighterprints/mobile/font-awesome/images/icons-36-white-pack.png has changed diff -r 48e31ed50bba14b37ecfbbb9852b378fd521bd67 -r 82bc16b1b4e9ff4bbc4a554bb8ab14577b42821c vcweb/lighterprints/templates/lighterprints/mobile/font-awesome/index.html --- /dev/null +++ b/vcweb/lighterprints/templates/lighterprints/mobile/font-awesome/index.html @@ -0,0 +1,305 @@ +<!doctype html> +<html> +<head> + <title> jQuery Mobile Icon Pack</title> + + <meta name="viewport" content="width=device-width, initial-scale=1"> + + <!-- jQuery Mobile CSS bits --> + <link rel="stylesheet" href="http://code.jquery.com/mobile/1.2.0/jquery.mobile-1.2.0.min.css" /> + + <!-- Custom css --> + <link rel="stylesheet" href="jqm-icon-pack-3.0.0-fa.css" /> + + <!-- Javascript includes --> + <script src="http://code.jquery.com/jquery-1.8.2.min.js"></script> + <script src="http://code.jquery.com/mobile/1.2.0/jquery.mobile-1.2.0.min.js"></script> +</head> +<body> + <div data-role="page"> + + <div data-role="header"> + <a href="../index.html" data-icon="home">Back</a> + <h1>jQuery Mobile Icon Pack</h1> + </div> + + <div data-role="content"> + + <a href="http://jqmiconpack.andymatthews.net" data-ajax="false" data-role="button" data-theme="e">Build your own!</a> + <a href="https://github.com/commadelimited/jQuery-Mobile-Icon-Pack" data-role="button">Download the Icon Pack</a> + + <h3>Font Awesome Icons</h3> + <a href="index.html" data-role="button" data-icon="cloud-download" data-theme="b">data-icon="cloud-download"</a> + <a href="index.html" data-role="button" data-icon="cloud-upload" data-theme="b">data-icon="cloud-upload"</a> + <a href="index.html" data-role="button" data-icon="lightbulb" data-theme="b">data-icon="lightbulb"</a> + <a href="index.html" data-role="button" data-icon="exchange" data-theme="b">data-icon="exchange"</a> + <a href="index.html" data-role="button" data-icon="bell-alt" data-theme="b">data-icon="bell-alt"</a> + <a href="index.html" data-role="button" data-icon="file-alt" data-theme="b">data-icon="file-alt"</a> + <a href="index.html" data-role="button" data-icon="beer" data-theme="b">data-icon="beer"</a> + <a href="index.html" data-role="button" data-icon="coffee" data-theme="b">data-icon="coffee"</a> + <a href="index.html" data-role="button" data-icon="food" data-theme="b">data-icon="food"</a> + <a href="index.html" data-role="button" data-icon="fighter-jet" data-theme="b">data-icon="fighter-jet"</a> + <a href="index.html" data-role="button" data-icon="user-md" data-theme="b">data-icon="user-md"</a> + <a href="index.html" data-role="button" data-icon="stethoscope" data-theme="b">data-icon="stethoscope"</a> + <a href="index.html" data-role="button" data-icon="suitcase" data-theme="b">data-icon="suitcase"</a> + <a href="index.html" data-role="button" data-icon="building" data-theme="b">data-icon="building"</a> + <a href="index.html" data-role="button" data-icon="hospital" data-theme="b">data-icon="hospital"</a> + <a href="index.html" data-role="button" data-icon="ambulance" data-theme="b">data-icon="ambulance"</a> + <a href="index.html" data-role="button" data-icon="medkit" data-theme="b">data-icon="medkit"</a> + <a href="index.html" data-role="button" data-icon="h-sign" data-theme="b">data-icon="h-sign"</a> + <a href="index.html" data-role="button" data-icon="plus-sign-alt" data-theme="b">data-icon="plus-sign-alt"</a> + <a href="index.html" data-role="button" data-icon="spinner" data-theme="b">data-icon="spinner"</a> + <a href="index.html" data-role="button" data-icon="angle-left" data-theme="b">data-icon="angle-left"</a> + <a href="index.html" data-role="button" data-icon="angle-right" data-theme="b">data-icon="angle-right"</a> + <a href="index.html" data-role="button" data-icon="angle-up" data-theme="b">data-icon="angle-up"</a> + <a href="index.html" data-role="button" data-icon="angle-down" data-theme="b">data-icon="angle-down"</a> + <a href="index.html" data-role="button" data-icon="double-angle-left" data-theme="b">data-icon="double-angle-left"</a> + <a href="index.html" data-role="button" data-icon="double-angle-right" data-theme="b">data-icon="double-angle-right"</a> + <a href="index.html" data-role="button" data-icon="double-angle-up" data-theme="b">data-icon="double-angle-up"</a> + <a href="index.html" data-role="button" data-icon="double-angle-down" data-theme="b">data-icon="double-angle-down"</a> + <a href="index.html" data-role="button" data-icon="circle-blank" data-theme="b">data-icon="circle-blank"</a> + <a href="index.html" data-role="button" data-icon="circle" data-theme="b">data-icon="circle"</a> + <a href="index.html" data-role="button" data-icon="desktop" data-theme="b">data-icon="desktop"</a> + <a href="index.html" data-role="button" data-icon="laptop" data-theme="b">data-icon="laptop"</a> + <a href="index.html" data-role="button" data-icon="tablet" data-theme="b">data-icon="tablet"</a> + <a href="index.html" data-role="button" data-icon="mobile-phone" data-theme="b">data-icon="mobile-phone"</a> + <a href="index.html" data-role="button" data-icon="quote-left" data-theme="b">data-icon="quote-left"</a> + <a href="index.html" data-role="button" data-icon="quote-right" data-theme="b">data-icon="quote-right"</a> + <a href="index.html" data-role="button" data-icon="github-alt" data-theme="b">data-icon="github-alt"</a> + <a href="index.html" data-role="button" data-icon="folder-close-alt" data-theme="b">data-icon="folder-close-alt"</a> + <a href="index.html" data-role="button" data-icon="folder-open-alt" data-theme="b">data-icon="folder-open-alt"</a> + + + + + + + + + <a href="index.html" data-role="button" data-icon="glass">data-icon="glass"</a> + <a href="index.html" data-role="button" data-icon="music">data-icon="music"</a> + <a href="index.html" data-role="button" data-icon="fasearch">data-icon="fasearch"</a> + <a href="index.html" data-role="button" data-icon="envelope">data-icon="envelope"</a> + <a href="index.html" data-role="button" data-icon="heart">data-icon="heart"</a> + <a href="index.html" data-role="button" data-icon="fastar">data-icon="fastar"</a> + <a href="index.html" data-role="button" data-icon="star-empty">data-icon="star-empty"</a> + <a href="index.html" data-role="button" data-icon="user">data-icon="user"</a> + <a href="index.html" data-role="button" data-icon="film">data-icon="film"</a> + <a href="index.html" data-role="button" data-icon="th-large">data-icon="th-large"</a> + <a href="index.html" data-role="button" data-icon="th">data-icon="th"</a> + <a href="index.html" data-role="button" data-icon="th-list">data-icon="th-list"</a> + <a href="index.html" data-role="button" data-icon="ok">data-icon="ok"</a> + <a href="index.html" data-role="button" data-icon="remove">data-icon="remove"</a> + <a href="index.html" data-role="button" data-icon="zoom-in">data-icon="zoom-in"</a> + <a href="index.html" data-role="button" data-icon="zoom-out">data-icon="zoom-out"</a> + <a href="index.html" data-role="button" data-icon="off">data-icon="off"</a> + <a href="index.html" data-role="button" data-icon="signal">data-icon="signal"</a> + <a href="index.html" data-role="button" data-icon="cog">data-icon="cog"</a> + <a href="index.html" data-role="button" data-icon="trash">data-icon="trash"</a> + <a href="index.html" data-role="button" data-icon="fahome">data-icon="fahome"</a> + <a href="index.html" data-role="button" data-icon="file">data-icon="file"</a> + <a href="index.html" data-role="button" data-icon="time">data-icon="time"</a> + <a href="index.html" data-role="button" data-icon="road">data-icon="road"</a> + <a href="index.html" data-role="button" data-icon="download-alt">data-icon="download-alt"</a> + <a href="index.html" data-role="button" data-icon="download">data-icon="download"</a> + <a href="index.html" data-role="button" data-icon="upload">data-icon="upload"</a> + <a href="index.html" data-role="button" data-icon="inbox">data-icon="inbox"</a> + <a href="index.html" data-role="button" data-icon="play-circle">data-icon="play-circle"</a> + <a href="index.html" data-role="button" data-icon="repeat">data-icon="repeat"</a> + <a href="index.html" data-role="button" data-icon="farefresh">data-icon="farefresh"</a> + <a href="index.html" data-role="button" data-icon="list-alt">data-icon="list-alt"</a> + <a href="index.html" data-role="button" data-icon="lock">data-icon="lock"</a> + <a href="index.html" data-role="button" data-icon="flag">data-icon="flag"</a> + <a href="index.html" data-role="button" data-icon="headphones">data-icon="headphones"</a> + <a href="index.html" data-role="button" data-icon="volume-off">data-icon="volume-off"</a> + <a href="index.html" data-role="button" data-icon="volume-down">data-icon="volume-down"</a> + <a href="index.html" data-role="button" data-icon="volume-up">data-icon="volume-up"</a> + <a href="index.html" data-role="button" data-icon="qrcode">data-icon="qrcode"</a> + <a href="index.html" data-role="button" data-icon="barcode">data-icon="barcode"</a> + <a href="index.html" data-role="button" data-icon="tag">data-icon="tag"</a> + <a href="index.html" data-role="button" data-icon="tags">data-icon="tags"</a> + <a href="index.html" data-role="button" data-icon="book">data-icon="book"</a> + <a href="index.html" data-role="button" data-icon="bookmark">data-icon="bookmark"</a> + <a href="index.html" data-role="button" data-icon="print">data-icon="print"</a> + <a href="index.html" data-role="button" data-icon="camera">data-icon="camera"</a> + <a href="index.html" data-role="button" data-icon="font">data-icon="font"</a> + <a href="index.html" data-role="button" data-icon="bold">data-icon="bold"</a> + <a href="index.html" data-role="button" data-icon="italic">data-icon="italic"</a> + <a href="index.html" data-role="button" data-icon="text-height">data-icon="text-height"</a> + <a href="index.html" data-role="button" data-icon="text-width">data-icon="text-width"</a> + <a href="index.html" data-role="button" data-icon="align-left">data-icon="align-left"</a> + <a href="index.html" data-role="button" data-icon="align-center">data-icon="align-center"</a> + <a href="index.html" data-role="button" data-icon="align-right">data-icon="align-right"</a> + <a href="index.html" data-role="button" data-icon="align-justify">data-icon="align-justify"</a> + <a href="index.html" data-role="button" data-icon="list">data-icon="list"</a> + <a href="index.html" data-role="button" data-icon="indent-left">data-icon="indent-left"</a> + <a href="index.html" data-role="button" data-icon="indent-right">data-icon="indent-right"</a> + <a href="index.html" data-role="button" data-icon="facetime-video">data-icon="facetime-video"</a> + <a href="index.html" data-role="button" data-icon="picture">data-icon="picture"</a> + <a href="index.html" data-role="button" data-icon="pencil">data-icon="pencil"</a> + <a href="index.html" data-role="button" data-icon="map-marker">data-icon="map-marker"</a> + <a href="index.html" data-role="button" data-icon="adjust">data-icon="adjust"</a> + <a href="index.html" data-role="button" data-icon="tint">data-icon="tint"</a> + <a href="index.html" data-role="button" data-icon="edit">data-icon="edit"</a> + <a href="index.html" data-role="button" data-icon="share">data-icon="share"</a> + <a href="index.html" data-role="button" data-icon="facheck">data-icon="facheck"</a> + <a href="index.html" data-role="button" data-icon="move">data-icon="move"</a> + <a href="index.html" data-role="button" data-icon="step-backward">data-icon="step-backward"</a> + <a href="index.html" data-role="button" data-icon="fast-backward">data-icon="fast-backward"</a> + <a href="index.html" data-role="button" data-icon="backward">data-icon="backward"</a> + <a href="index.html" data-role="button" data-icon="play">data-icon="play"</a> + <a href="index.html" data-role="button" data-icon="pause">data-icon="pause"</a> + <a href="index.html" data-role="button" data-icon="stop">data-icon="stop"</a> + <a href="index.html" data-role="button" data-icon="faforward">data-icon="faforward"</a> + <a href="index.html" data-role="button" data-icon="fast-forward">data-icon="fast-forward"</a> + <a href="index.html" data-role="button" data-icon="step-forward">data-icon="step-forward"</a> + <a href="index.html" data-role="button" data-icon="eject">data-icon="eject"</a> + <a href="index.html" data-role="button" data-icon="chevron-left">data-icon="chevron-left"</a> + <a href="index.html" data-role="button" data-icon="chevron-right">data-icon="chevron-right"</a> + <a href="index.html" data-role="button" data-icon="plus-sign">data-icon="plus-sign"</a> + <a href="index.html" data-role="button" data-icon="minus-sign">data-icon="minus-sign"</a> + <a href="index.html" data-role="button" data-icon="remove-sign">data-icon="remove-sign"</a> + <a href="index.html" data-role="button" data-icon="ok-sign">data-icon="ok-sign"</a> + <a href="index.html" data-role="button" data-icon="question-sign">data-icon="question-sign"</a> + <a href="index.html" data-role="button" data-icon="info-sign">data-icon="info-sign"</a> + <a href="index.html" data-role="button" data-icon="screenshot">data-icon="screenshot"</a> + <a href="index.html" data-role="button" data-icon="remove-circle">data-icon="remove-circle"</a> + <a href="index.html" data-role="button" data-icon="ok-circle">data-icon="ok-circle"</a> + <a href="index.html" data-role="button" data-icon="ban-circle">data-icon="ban-circle"</a> + <a href="index.html" data-role="button" data-icon="arrow-left">data-icon="arrow-left"</a> + <a href="index.html" data-role="button" data-icon="arrow-right">data-icon="arrow-right"</a> + <a href="index.html" data-role="button" data-icon="arrow-up">data-icon="arrow-up"</a> + <a href="index.html" data-role="button" data-icon="arrow-down">data-icon="arrow-down"</a> + <a href="index.html" data-role="button" data-icon="share-alt">data-icon="share-alt"</a> + <a href="index.html" data-role="button" data-icon="resize-full">data-icon="resize-full"</a> + <a href="index.html" data-role="button" data-icon="resize-small">data-icon="resize-small"</a> + <a href="index.html" data-role="button" data-icon="faplus">data-icon="faplus"</a> + <a href="index.html" data-role="button" data-icon="faminus">data-icon="faminus"</a> + <a href="index.html" data-role="button" data-icon="asterisk">data-icon="asterisk"</a> + <a href="index.html" data-role="button" data-icon="exclamation-sign">data-icon="exclamation-sign"</a> + <a href="index.html" data-role="button" data-icon="gift">data-icon="gift"</a> + <a href="index.html" data-role="button" data-icon="leaf">data-icon="leaf"</a> + <a href="index.html" data-role="button" data-icon="fire">data-icon="fire"</a> + <a href="index.html" data-role="button" data-icon="eye-open">data-icon="eye-open"</a> + <a href="index.html" data-role="button" data-icon="eye-close">data-icon="eye-close"</a> + <a href="index.html" data-role="button" data-icon="warning-sign">data-icon="warning-sign"</a> + <a href="index.html" data-role="button" data-icon="plane">data-icon="plane"</a> + <a href="index.html" data-role="button" data-icon="calendar">data-icon="calendar"</a> + <a href="index.html" data-role="button" data-icon="random">data-icon="random"</a> + <a href="index.html" data-role="button" data-icon="comment">data-icon="comment"</a> + <a href="index.html" data-role="button" data-icon="magnet">data-icon="magnet"</a> + <a href="index.html" data-role="button" data-icon="chevron-up">data-icon="chevron-up"</a> + <a href="index.html" data-role="button" data-icon="chevron-down">data-icon="chevron-down"</a> + <a href="index.html" data-role="button" data-icon="retweet">data-icon="retweet"</a> + <a href="index.html" data-role="button" data-icon="shopping-cart">data-icon="shopping-cart"</a> + <a href="index.html" data-role="button" data-icon="folder-close">data-icon="folder-close"</a> + <a href="index.html" data-role="button" data-icon="folder-open">data-icon="folder-open"</a> + <a href="index.html" data-role="button" data-icon="resize-vertical">data-icon="resize-vertical"</a> + <a href="index.html" data-role="button" data-icon="resize-horizontal">data-icon="resize-horizontal"</a> + <a href="index.html" data-role="button" data-icon="bar-chart">data-icon="bar-chart"</a> + <a href="index.html" data-role="button" data-icon="twitter-sign">data-icon="twitter-sign"</a> + <a href="index.html" data-role="button" data-icon="facebook-sign">data-icon="facebook-sign"</a> + <a href="index.html" data-role="button" data-icon="camera-retro">data-icon="camera-retro"</a> + <a href="index.html" data-role="button" data-icon="key">data-icon="key"</a> + <a href="index.html" data-role="button" data-icon="cogs">data-icon="cogs"</a> + <a href="index.html" data-role="button" data-icon="comments">data-icon="comments"</a> + <a href="index.html" data-role="button" data-icon="thumbs-up">data-icon="thumbs-up"</a> + <a href="index.html" data-role="button" data-icon="thumbs-down">data-icon="thumbs-down"</a> + <a href="index.html" data-role="button" data-icon="star-half">data-icon="star-half"</a> + <a href="index.html" data-role="button" data-icon="heart-empty">data-icon="heart-empty"</a> + <a href="index.html" data-role="button" data-icon="signout">data-icon="signout"</a> + <a href="index.html" data-role="button" data-icon="linkedin-sign">data-icon="linkedin-sign"</a> + <a href="index.html" data-role="button" data-icon="pushpin">data-icon="pushpin"</a> + <a href="index.html" data-role="button" data-icon="external-link">data-icon="external-link"</a> + <a href="index.html" data-role="button" data-icon="signin">data-icon="signin"</a> + <a href="index.html" data-role="button" data-icon="trophy">data-icon="trophy"</a> + <a href="index.html" data-role="button" data-icon="github-sign">data-icon="github-sign"</a> + <a href="index.html" data-role="button" data-icon="upload-alt">data-icon="upload-alt"</a> + <a href="index.html" data-role="button" data-icon="lemon">data-icon="lemon"</a> + + + + + <a href="index.html" data-role="button" data-icon="beaker">data-icon="beaker"</a> + <a href="index.html" data-role="button" data-icon="bell">data-icon="bell"</a> + <a href="index.html" data-role="button" data-icon="bolt">data-icon="bolt"</a> + <a href="index.html" data-role="button" data-icon="bookmark-empty">data-icon="bookmark-empty"</a> + <a href="index.html" data-role="button" data-icon="briefcase">data-icon="briefcase"</a> + <a href="index.html" data-role="button" data-icon="bullhorn">data-icon="bullhorn"</a> + <a href="index.html" data-role="button" data-icon="caret-down">data-icon="caret-down"</a> + <a href="index.html" data-role="button" data-icon="caret-left">data-icon="caret-left"</a> + <a href="index.html" data-role="button" data-icon="caret-right">data-icon="caret-right"</a> + <a href="index.html" data-role="button" data-icon="caret-up">data-icon="caret-up"</a> + <a href="index.html" data-role="button" data-icon="certificate">data-icon="certificate"</a> + <a href="index.html" data-role="button" data-icon="check-empty">data-icon="check-empty"</a> + <a href="index.html" data-role="button" data-icon="circle-arrow-down">data-icon="circle-arrow-down"</a> + <a href="index.html" data-role="button" data-icon="circle-arrow-left">data-icon="circle-arrow-left"</a> + <a href="index.html" data-role="button" data-icon="circle-arrow-right">data-icon="circle-arrow-right"</a> + <a href="index.html" data-role="button" data-icon="circle-arrow-up">data-icon="circle-arrow-up"</a> + <a href="index.html" data-role="button" data-icon="cloud">data-icon="cloud"</a> + <a href="index.html" data-role="button" data-icon="columns">data-icon="columns"</a> + <a href="index.html" data-role="button" data-icon="comment-alt">data-icon="comment-alt"</a> + <a href="index.html" data-role="button" data-icon="comments-alt">data-icon="comments-alt"</a> + <a href="index.html" data-role="button" data-icon="copy">data-icon="copy"</a> + <a href="index.html" data-role="button" data-icon="credit-card">data-icon="credit-card"</a> + <a href="index.html" data-role="button" data-icon="cut">data-icon="cut"</a> + <a href="index.html" data-role="button" data-icon="dashboard">data-icon="dashboard"</a> + <a href="index.html" data-role="button" data-icon="envelope-alt">data-icon="envelope-alt"</a> + <a href="index.html" data-role="button" data-icon="facebook">data-icon="facebook"</a> + <a href="index.html" data-role="button" data-icon="filter">data-icon="filter"</a> + <a href="index.html" data-role="button" data-icon="fullscreen">data-icon="fullscreen"</a> + <a href="index.html" data-role="button" data-icon="github">data-icon="github"</a> + <a href="index.html" data-role="button" data-icon="globe">data-icon="globe"</a> + <a href="index.html" data-role="button" data-icon="google-plus-sign">data-icon="google-plus-sign"</a> + <a href="index.html" data-role="button" data-icon="google-plus">data-icon="google-plus"</a> + <a href="index.html" data-role="button" data-icon="group">data-icon="group"</a> + <a href="index.html" data-role="button" data-icon="hand-down">data-icon="hand-down"</a> + <a href="index.html" data-role="button" data-icon="hand-left">data-icon="hand-left"</a> + <a href="index.html" data-role="button" data-icon="hand-right">data-icon="hand-right"</a> + <a href="index.html" data-role="button" data-icon="hand-up">data-icon="hand-up"</a> + <a href="index.html" data-role="button" data-icon="hdd">data-icon="hdd"</a> + <a href="index.html" data-role="button" data-icon="legal">data-icon="legal"</a> + <a href="index.html" data-role="button" data-icon="link">data-icon="link"</a> + <a href="index.html" data-role="button" data-icon="linkedin">data-icon="linkedin"</a> + <a href="index.html" data-role="button" data-icon="list-ol">data-icon="list-ol"</a> + <a href="index.html" data-role="button" data-icon="list-ul">data-icon="list-ul"</a> + <a href="index.html" data-role="button" data-icon="magic">data-icon="magic"</a> + <a href="index.html" data-role="button" data-icon="money">data-icon="money"</a> + <a href="index.html" data-role="button" data-icon="paper-clip">data-icon="paper-clip"</a> + <a href="index.html" data-role="button" data-icon="paste">data-icon="paste"</a> + <a href="index.html" data-role="button" data-icon="phone-sign">data-icon="phone-sign"</a> + <a href="index.html" data-role="button" data-icon="phone">data-icon="phone"</a> + <a href="index.html" data-role="button" data-icon="pinterest-sign">data-icon="pinterest-sign"</a> + <a href="index.html" data-role="button" data-icon="pinterest">data-icon="pinterest"</a> + <a href="index.html" data-role="button" data-icon="reorder">data-icon="reorder"</a> + <a href="index.html" data-role="button" data-icon="rss">data-icon="rss"</a> + <a href="index.html" data-role="button" data-icon="save">data-icon="save"</a> + <a href="index.html" data-role="button" data-icon="sign-blank">data-icon="sign-blank"</a> + <a href="index.html" data-role="button" data-icon="sitemap">data-icon="sitemap"</a> + <a href="index.html" data-role="button" data-icon="sort-down">data-icon="sort-down"</a> + <a href="index.html" data-role="button" data-icon="sort-up">data-icon="sort-up"</a> + <a href="index.html" data-role="button" data-icon="sort">data-icon="sort"</a> + <a href="index.html" data-role="button" data-icon="strikethrough">data-icon="strikethrough"</a> + <a href="index.html" data-role="button" data-icon="table">data-icon="table"</a> + <a href="index.html" data-role="button" data-icon="tasks">data-icon="tasks"</a> + <a href="index.html" data-role="button" data-icon="truck">data-icon="truck"</a> + <a href="index.html" data-role="button" data-icon="twitter">data-icon="twitter"</a> + <a href="index.html" data-role="button" data-icon="umbrella">data-icon="umbrella"</a> + <a href="index.html" data-role="button" data-icon="underline">data-icon="underline"</a> + <a href="index.html" data-role="button" data-icon="undo">data-icon="undo"</a> + <a href="index.html" data-role="button" data-icon="unlock">data-icon="unlock"</a> + <a href="index.html" data-role="button" data-icon="user-md">data-icon="user-md"</a> + <a href="index.html" data-role="button" data-icon="wrench">data-icon="wrench"</a> + </div> + + <p align="center"> + Glyphs courtesy of <a href="http://fortawesome.github.com/Font-Awesome/">FontAwesome</a> + </p> + + <div data-role="footer" data-theme="c"> + <p align="center">© 2013 - Andy Matthews</p> + </div> + + </div> +</body> +</html> diff -r 48e31ed50bba14b37ecfbbb9852b378fd521bd67 -r 82bc16b1b4e9ff4bbc4a554bb8ab14577b42821c vcweb/lighterprints/templates/lighterprints/mobile/font-awesome/jqm-icon-pack-3.0.0-fa.css --- /dev/null +++ b/vcweb/lighterprints/templates/lighterprints/mobile/font-awesome/jqm-icon-pack-3.0.0-fa.css @@ -0,0 +1,1 @@ +.ui-icon{width:20px;height:20px;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;margin-top:-10px !important;line-height:20px}.ui-icon:before{margin-left:3px}.ui-btn-icon-notext .ui-btn-inner .ui-icon{margin:1px 1px 2px 2px !important}.ui-li-link-alt .ui-btn-inner .ui-icon{margin:-10px -10px auto auto !important}.ui-icon-plus,.ui-icon-minus,.ui-icon-delete,.ui-icon-arrow-r,.ui-icon-arrow-l,.ui-icon-arrow-u,.ui-icon-arrow-d,.ui-icon-check,.ui-icon-gear,.ui-icon-refresh,.ui-icon-forward,.ui-icon-back,.ui-icon-grid,.ui-icon-star,.ui-icon-alert,.ui-icon-info,.ui-icon-home,.ui-icon-search,.ui-icon-searchfield:after,.ui-icon-checkbox-off,.ui-icon-checkbox-on,.ui-icon-radio-off,.ui-icon-radio-on,.ui-icon-email,.ui-icon-page,.ui-icon-question,.ui-icon-foursquare,.ui-icon-dollar,.ui-icon-euro,.ui-icon-pound,.ui-icon-apple,.ui-icon-chat,.ui-icon-trash,.ui-icon-mappin,.ui-icon-direction,.ui-icon-heart,.ui-icon-wrench,.ui-icon-play,.ui-icon-pause,.ui-icon-stop,.ui-icon-person,.ui-icon-music,.ui-icon-wifi,.ui-icon-phone,.ui-icon-power,.ui-icon-lightning,.ui-icon-drink,.ui-icon-android{background-image:url("images/icons-18-white-pack.png") !important}@media only screen and (-webkit-min-device-pixel-ratio: 1.5), only screen and (min--moz-device-pixel-ratio: 1.5), only screen and (min-resolution: 240dpi){.ui-icon-plus,.ui-icon-minus,.ui-icon-delete,.ui-icon-arrow-r,.ui-icon-arrow-l,.ui-icon-arrow-u,.ui-icon-arrow-d,.ui-icon-check,.ui-icon-gear,.ui-icon-refresh,.ui-icon-forward,.ui-icon-back,.ui-icon-grid,.ui-icon-star,.ui-icon-alert,.ui-icon-info,.ui-icon-home,.ui-icon-search,.ui-icon-searchfield:after,.ui-icon-checkbox-off,.ui-icon-checkbox-on,.ui-icon-radio-off,.ui-icon-radio-on,.ui-icon-email,.ui-icon-page,.ui-icon-question,.ui-icon-foursquare,.ui-icon-dollar,.ui-icon-euro,.ui-icon-pound,.ui-icon-apple,.ui-icon-chat,.ui-icon-trash,.ui-icon-mappin,.ui-icon-direction,.ui-icon-heart,.ui-icon-wrench,.ui-icon-play,.ui-icon-pause,.ui-icon-stop,.ui-icon-person,.ui-icon-music,.ui-icon-wifi,.ui-icon-phone,.ui-icon-power,.ui-icon-lightning,.ui-icon-drink,.ui-icon-android{background-image:url("images/icons-36-white-pack.png");-moz-background-size:774px 54px;-o-background-size:774px 54px;-webkit-background-size:774px 54px;background-size:774px 54px}.ui-icon-alt{background-image:url("images/icons-36-black-pack.png")}}.ui-icon-plus{background-position:0px 1px !important}.ui-icon-minus{background-position:-36px 1px !important}.ui-icon-delete{background-position:-71px 1px !important}.ui-icon-arrow-r{background-position:-107px 1px !important}.ui-icon-arrow-l{background-position:-143px 1px !important}.ui-icon-arrow-u{background-position:-179px 1px !important}.ui-icon-arrow-d{background-position:-215px 1px !important}.ui-icon-check{background-position:-251px 1px !important}.ui-icon-gear{background-position:-287px 1px !important}.ui-icon-refresh{background-position:-323px 1px !important}.ui-icon-forward{background-position:-359px 1px !important}.ui-icon-back{background-position:-396px 0 !important}.ui-icon-grid{background-position:-431px 1px !important}.ui-icon-star{background-position:-467px 1px !important}.ui-icon-alert{background-position:-503px 1px !important}.ui-icon-info{background-position:-539px 1px !important}.ui-icon-home{background-position:-575px 1px !important}.ui-icon-search,.ui-icon-searchfield:after{background-position:-611px 0px !important}.ui-icon-checkbox-off{background-position:-681px 1px !important}.ui-icon-checkbox-on{background-position:-647px 1px !important}.ui-icon-radio-off{background-position:-752px 1px !important}.ui-icon-radio-on{background-position:-717px 1px !important}.ui-icon-email{background-position:1px -17px !important}.ui-icon-page{background-position:-36px -17px !important}.ui-icon-question{background-position:-71px -17px !important}.ui-icon-foursquare{background-position:-107px -17px !important}.ui-icon-dollar{background-position:-215px -17px !important}.ui-icon-euro{background-position:-251px -17px !important}.ui-icon-pound{background-position:-287px -17px !important}.ui-icon-apple{background-position:-323px -17px !important}.ui-icon-chat{background-position:-359px -17px !important}.ui-icon-trash{background-position:-395px -17px !important}.ui-icon-mappin{background-position:-467px -17px !important}.ui-icon-direction{background-position:-503px -17px !important}.ui-icon-heart{background-position:-539px -17px !important}.ui-icon-wrench{background-position:-575px -17px !important}.ui-icon-play{background-position:-611px -17px !important}.ui-icon-pause{background-position:-647px -17px !important}.ui-icon-stop{background-position:-683px -17px !important}.ui-icon-person{background-position:-719px -17px !important}.ui-icon-music{background-position:-755px -17px !important}.ui-icon-wifi{background-position:-35px -34px !important}.ui-icon-phone{background-position:-72px -36px !important}.ui-icon-power{background-position:-107px -35px !important}.ui-icon-lightning{background-position:-251px -35px !important}.ui-icon-android{background-position:-323px -35px !important}@font-face{font-family:'FontAwesome';src:url("font/fontawesome-webfont.eot");src:url("font/fontawesome-webfont.eot?#iefix") format("embedded-opentype"),url("font/fontawesome-webfont.woff") format("woff"),url("font/fontawesome-webfont.ttf") format("truetype");font-weight:normal;font-style:normal}[class^="ui-icon-"]:before,[class*=" ui-icon-"]:before{font-family:FontAwesome !important;font-weight:normal;font-style:normal;display:inline-block}.ui-icon:not(.ui-icon-loading),.ui-icon-searchfield::after{background:#666666;background:rgba(0,0,0,0.4);color:#ffffff;font-weight:normal;text-shadow:none}.ui-icon-cloud-download:before{content:"\f0ed";margin-left:2px}.ui-icon-cloud-upload:before{content:"\f0ee";margin-left:2px}.ui-icon-lightbulb:before{content:"\f0eb";margin-top:1px;margin-left:3px}.ui-icon-exchange:before{content:"\f0ec"}.ui-icon-bell-alt:before{content:"\f0f3"}.ui-icon-file-alt:before{content:"\f0f6"}.ui-icon-beer:before{content:"\f0fc";margin-top:1px;margin-left:2px}.ui-icon-coffee:before{content:"\f0f4";margin-left:2px}.ui-icon-food:before{content:"\f0f5";margin-top:1px;margin-left:4px}.ui-icon-fighter-jet:before{content:"\f0fb";margin-top:1px;margin-left:2px}.ui-icon-user-md:before{content:"\f0f0"}.ui-icon-stethoscope:before{content:"\f0f1";margin-top:1px;margin-left:4px}.ui-icon-suitcase:before{content:"\f0f2";margin-left:2px}.ui-icon-building:before{content:"\f0f7"}.ui-icon-hospital:before{content:"\f0f8";margin-left:4px}.ui-icon-ambulance:before{content:"\f0f9";margin-top:1px;margin-left:1px}.ui-icon-medkit:before{content:"\f0fa";margin-top:0px;margin-left:2px}.ui-icon-h-sign:before{content:"\f0fd"}.ui-icon-plus-sign-alt:before{content:"\f0fe"}.ui-icon-spinner:before{content:"\f110"}.ui-icon-angle-left:before{content:"\f104"}.ui-icon-angle-right:before{content:"\f105"}.ui-icon-angle-up:before{content:"\f106"}.ui-icon-angle-down:before{content:"\f107"}.ui-icon-double-angle-left:before{content:"\f100"}.ui-icon-double-angle-right:before{content:"\f101";margin-left:4px}.ui-icon-double-angle-up:before{content:"\f102"}.ui-icon-double-angle-down:before{content:"\f103";margin-top:1px}.ui-icon-circle-blank:before{content:"\f10c"}.ui-icon-circle:before{content:"\f111"}.ui-icon-desktop:before{content:"\f108";margin-top:1px;margin-left:2px}.ui-icon-laptop:before{content:"\f109";margin-top:1px;margin-left:2px}.ui-icon-tablet:before{content:"\f10a";margin-top:1px}.ui-icon-mobile-phone:before{content:"\f10b"}.ui-icon-quote-left:before{content:"\f10d"}.ui-icon-quote-right:before{content:"\f10e"}.ui-icon-github-alt:before{content:"\f113"}.ui-icon-folder-close-alt:before{content:"\f114"}.ui-icon-folder-open-alt:before{content:"\f115"}.ui-icon-glass:before{content:"\f000";margin-top:2px}.ui-icon-music:before{content:"\f001";margin-left:1px;margin-top:2px}.ui-icon-fasearch:before{content:"\f002"}.ui-icon-envelope:before{content:"\f003";margin-left:-1px;margin-left:2px;margin-top:1px}.ui-icon-heart:before{content:"\f004";margin-left:3px;margin-top:2px}.ui-icon-fastar:before{content:"\f005"}.ui-icon-star-empty:before{content:"\f006"}.ui-icon-user:before{content:"\f007";margin-left:4px}.ui-icon-film:before{content:"\f008";margin-left:2px}.ui-icon-th-large:before{content:"\f009";margin-left:2px;margin-top:2px}.ui-icon-th:before{content:"\f00a";margin-left:3px;margin-top:2px}.ui-icon-th-list:before{content:"\f00b";margin-left:3px;margin-top:2px}.ui-icon-ok:before{content:"\f00c";margin-left:2px}.ui-icon-remove:before{content:"\f00d";margin-left:3px;margin-top:2px}.ui-icon-zoom-in:before{content:"\f00e"}.ui-icon-zoom-out:before{content:"\f010"}.ui-icon-off:before{content:"\f011"}.ui-icon-signal:before{content:"\f012";margin-left:-1px}.ui-icon-cog:before{content:"\f013";margin-left:3px;margin-top:2px}.ui-icon-trash:before{content:"\f014"}.ui-icon-fahome:before{content:"\f015"}.ui-icon-file:before{content:"\f016"}.ui-icon-time:before{content:"\f017";margin-top:2px}.ui-icon-road:before{content:"\f018"}.ui-icon-download-alt:before{content:"\f019"}.ui-icon-download:before{content:"\f01a";margin-top:2px}.ui-icon-upload:before{content:"\f01b";margin-top:2px}.ui-icon-inbox:before{content:"\f01c"}.ui-icon-play-circle:before{content:"\f01d";margin-top:2px}.ui-icon-repeat:before{content:"\f01e";margin-top:2px}.ui-icon-farefresh:before{content:"\f021";margin-top:2px}.ui-icon-list-alt:before{content:"\f022";margin-left:3px;margin-top:2px}.ui-icon-lock:before{content:"\f023"}.ui-icon-flag:before{content:"\f024";margin-top:2px}.ui-icon-headphones:before{content:"\f025"}.ui-icon-volume-off:before{content:"\f026"}.ui-icon-volume-down:before{content:"\f027"}.ui-icon-volume-up:before{content:"\f028"}.ui-icon-qrcode:before{content:"\f029"}.ui-icon-barcode:before{content:"\f02a"}.ui-icon-tag:before{content:"\f02b"}.ui-icon-tags:before{content:"\f02c"}.ui-icon-book:before{content:"\f02d"}.ui-icon-bookmark:before{content:"\f02e"}.ui-icon-print:before{content:"\f02f"}.ui-icon-camera:before{content:"\f030"}.ui-icon-font:before{content:"\f031";margin-left:2px}.ui-icon-bold:before{content:"\f032";margin-left:2px}.ui-icon-italic:before{content:"\f033"}.ui-icon-text-height:before{content:"\f034"}.ui-icon-text-width:before{content:"\f035"}.ui-icon-align-left:before{content:"\f036"}.ui-icon-align-center:before{content:"\f037"}.ui-icon-align-right:before{content:"\f038"}.ui-icon-align-justify:before{content:"\f039"}.ui-icon-list:before{content:"\f03a"}.ui-icon-indent-left:before{content:"\f03b";margin-left:0px;margin-top:2px}.ui-icon-indent-right:before{content:"\f03c"}.ui-icon-facetime-video:before{content:"\f03d"}.ui-icon-picture:before{content:"\f03e"}.ui-icon-pencil:before{content:"\f040"}.ui-icon-map-marker:before{content:"\f041";margin-left:3px;margin-top:2px}.ui-icon-adjust:before{content:"\f042";margin-top:2px}.ui-icon-tint:before{content:"\f043"}.ui-icon-edit:before{content:"\f044"}.ui-icon-share:before{content:"\f045"}.ui-icon-facheck:before{content:"\f046"}.ui-icon-move:before{content:"\f047"}.ui-icon-step-backward:before{content:"\f048"}.ui-icon-fast-backward:before{content:"\f049"}.ui-icon-backward:before{content:"\f04a"}.ui-icon-play:before{content:"\f04b";margin-left:6px;margin-top:2px}.ui-icon-pause:before{content:"\f04c";margin-top:2px}.ui-icon-stop:before{content:"\f04d";margin-top:2px}.ui-icon-faforward:before{content:"\f04e"}.ui-icon-fast-forward:before{content:"\f050"}.ui-icon-step-forward:before{content:"\f051"}.ui-icon-eject:before{content:"\f052"}.ui-icon-chevron-left:before{content:"\f053";margin-top:2px}.ui-icon-chevron-right:before{content:"\f054";margin-top:2px}.ui-icon-plus-sign:before{content:"\f055";margin-top:2px}.ui-icon-minus-sign:before{content:"\f056";margin-top:2px}.ui-icon-remove-sign:before{content:"\f057";margin-top:2px}.ui-icon-ok-sign:before{content:"\f058";margin-top:2px}.ui-icon-question-sign:before{content:"\f059";margin-top:2px}.ui-icon-info-sign:before{content:"\f05a";margin-top:2px}.ui-icon-screenshot:before{content:"\f05b"}.ui-icon-remove-circle:before{content:"\f05c";margin-top:2px}.ui-icon-ok-circle:before{content:"\f05d";margin-top:2px}.ui-icon-ban-circle:before{content:"\f05e";margin-top:2px}.ui-icon-arrow-left:before{content:"\f060"}.ui-icon-arrow-right:before{content:"\f061"}.ui-icon-arrow-up:before{content:"\f062"}.ui-icon-arrow-down:before{content:"\f063"}.ui-icon-share-alt:before{content:"\f064"}.ui-icon-resize-full:before{content:"\f065"}.ui-icon-resize-small:before{content:"\f066"}.ui-icon-faplus:before{content:"\f067"}.ui-icon-faminus:before{content:"\f068"}.ui-icon-asterisk:before{content:"\f069";margin-top:2px}.ui-icon-exclamation-sign:before{content:"\f06a";margin-top:2px}.ui-icon-gift:before{content:"\f06b"}.ui-icon-leaf:before{content:"\f06c"}.ui-icon-fire:before{content:"\f06d"}.ui-icon-eye-open:before{content:"\f06e"}.ui-icon-eye-close:before{content:"\f070"}.ui-icon-warning-sign:before{content:"\f071"}.ui-icon-plane:before{content:"\f072"}.ui-icon-calendar:before{content:"\f073"}.ui-icon-random:before{content:"\f074"}.ui-icon-comment:before{content:"\f075";margin-top:2px}.ui-icon-magnet:before{content:"\f076";margin-top:2px}.ui-icon-chevron-up:before{content:"\f077"}.ui-icon-chevron-down:before{content:"\f078"}.ui-icon-retweet:before{content:"\f079"}.ui-icon-shopping-cart:before{content:"\f07a"}.ui-icon-folder-close:before{content:"\f07b"}.ui-icon-folder-open:before{content:"\f07c"}.ui-icon-resize-vertical:before{content:"\f07d"}.ui-icon-resize-horizontal:before{content:"\f07e"}.ui-icon-bar-chart:before{content:"\f080"}.ui-icon-twitter-sign:before{content:"\f081"}.ui-icon-facebook-sign:before{content:"\f082"}.ui-icon-camera-retro:before{content:"\f083"}.ui-icon-key:before{content:"\f084"}.ui-icon-cogs:before{content:"\f085"}.ui-icon-comments:before{content:"\f086"}.ui-icon-thumbs-up:before{content:"\f087"}.ui-icon-thumbs-down:before{content:"\f088"}.ui-icon-star-half:before{content:"\f089"}.ui-icon-heart-empty:before{content:"\f08a";margin-top:2px}.ui-icon-signout:before{content:"\f08b"}.ui-icon-linkedin-sign:before{content:"\f08c"}.ui-icon-pushpin:before{content:"\f08d"}.ui-icon-external-link:before{content:"\f08e"}.ui-icon-signin:before{content:"\f090"}.ui-icon-trophy:before{content:"\f091"}.ui-icon-github-sign:before{content:"\f092"}.ui-icon-upload-alt:before{content:"\f093"}.ui-icon-lemon:before{content:"\f094"}.ui-icon-phone:before{content:"\f095"}.ui-icon-check-empty:before{content:"\f096"}.ui-icon-bookmark-empty:before{content:"\f097"}.ui-icon-phone-sign:before{content:"\f098"}.ui-icon-twitter:before{content:"\f099"}.ui-icon-facebook:before{content:"\f09a"}.ui-icon-github:before{content:"\f09b";margin-top:2px}.ui-icon-unlock:before{content:"\f09c"}.ui-icon-credit-card:before{content:"\f09d"}.ui-icon-rss:before{content:"\f09e"}.ui-icon-hdd:before{content:"\f0a0"}.ui-icon-bullhorn:before{content:"\f0a1"}.ui-icon-bell:before{content:"\f0a2"}.ui-icon-certificate:before{content:"\f0a3";margin-top:2px}.ui-icon-hand-right:before{content:"\f0a4"}.ui-icon-hand-left:before{content:"\f0a5"}.ui-icon-hand-up:before{content:"\f0a6"}.ui-icon-hand-down:before{content:"\f0a7"}.ui-icon-circle-arrow-left:before{content:"\f0a8";margin-top:2px}.ui-icon-circle-arrow-right:before{content:"\f0a9";margin-top:2px}.ui-icon-circle-arrow-up:before{content:"\f0aa";margin-top:2px}.ui-icon-circle-arrow-down:before{content:"\f0ab";margin-top:2px}.ui-icon-globe:before{content:"\f0ac";margin-top:2px}.ui-icon-wrench:before{content:"\f0ad"}.ui-icon-tasks:before{content:"\f0ae"}.ui-icon-filter:before{content:"\f0b0"}.ui-icon-briefcase:before{content:"\f0b1"}.ui-icon-fullscreen:before{content:"\f0b2"}.ui-icon-group:before{content:"\f0c0"}.ui-icon-link:before{content:"\f0c1"}.ui-icon-cloud:before{content:"\f0c2"}.ui-icon-beaker:before{content:"\f0c3"}.ui-icon-cut:before{content:"\f0c4"}.ui-icon-copy:before{content:"\f0c5"}.ui-icon-paper-clip:before{content:"\f0c6"}.ui-icon-save:before{content:"\f0c7"}.ui-icon-sign-blank:before{content:"\f0c8"}.ui-icon-reorder:before{content:"\f0c9"}.ui-icon-list-ul:before{content:"\f0ca"}.ui-icon-list-ol:before{content:"\f0cb"}.ui-icon-strikethrough:before{content:"\f0cc"}.ui-icon-underline:before{content:"\f0cd"}.ui-icon-table:before{content:"\f0ce"}.ui-icon-magic:before{content:"\f0d0"}.ui-icon-truck:before{content:"\f0d1"}.ui-icon-pinterest:before{content:"\f0d2";margin-top:2px}.ui-icon-pinterest-sign:before{content:"\f0d3";margin-top:2px}.ui-icon-google-plus-sign:before{content:"\f0d4"}.ui-icon-google-plus:before{content:"\f0d5"}.ui-icon-money:before{content:"\f0d6"}.ui-icon-caret-down:before{content:"\f0d7";margin-top:2px}.ui-icon-caret-up:before{content:"\f0d8"}.ui-icon-caret-left:before{content:"\f0d9";margin-top:2px}.ui-icon-caret-right:before{content:"\f0da";margin-top:2px}.ui-icon-columns:before{content:"\f0db"}.ui-icon-sort:before{content:"\f0dc";margin-top:2px}.ui-icon-sort-down:before{content:"\f0dd"}.ui-icon-sort-up:before{content:"\f0de"}.ui-icon-envelope-alt:before{content:"\f0e0"}.ui-icon-linkedin:before{content:"\f0e1"}.ui-icon-undo:before{content:"\f0e2";margin-top:2px}.ui-icon-legal:before{content:"\f0e3"}.ui-icon-dashboard:before{content:"\f0e4"}.ui-icon-comment-alt:before{content:"\f0e5"}.ui-icon-comments-alt:before{content:"\f0e6"}.ui-icon-bolt:before{content:"\f0e7"}.ui-icon-sitemap:before{content:"\f0e8"}.ui-icon-umbrella:before{content:"\f0e9"}.ui-icon-paste:before{content:"\f0ea"}.ui-icon-user-md:before{content:"\f200"}.ui-icon-trophy { color: orange;}.ui-icon-heart { color: magenta;}.ui-icon-comment { color:blue;}.ui-icon-fastar { color:gold;} diff -r 48e31ed50bba14b37ecfbbb9852b378fd521bd67 -r 82bc16b1b4e9ff4bbc4a554bb8ab14577b42821c vcweb/lighterprints/templates/lighterprints/mobile/font-awesome/jqm-icon-pack-3.0.0-fa.scss --- /dev/null +++ b/vcweb/lighterprints/templates/lighterprints/mobile/font-awesome/jqm-icon-pack-3.0.0-fa.scss @@ -0,0 +1,419 @@ +/* + The following declaration increase the size of the "dot" which contains the icon + This is because some of the font awesome icons are larger than jQuery Mobile icons + It applies to ALL occurrences, but can be commented out or removed if necessary +*/ +.ui-icon { + width: 20px; + height: 20px; + -moz-border-radius: 10px; + -webkit-border-radius: 10px; + border-radius: 10px; + margin-top: -10px !important; + line-height: 20px; +} +.ui-icon:before { margin-left: 3px; } + +/* fix for Github issue #6 */ +.ui-btn-icon-notext .ui-btn-inner .ui-icon { + margin: 1px 1px 2px 2px !important; +} +.ui-li-link-alt .ui-btn-inner .ui-icon { + margin: -10px -10px auto auto !important; +} + +/* supporting original icons */ +.ui-icon-plus, .ui-icon-minus, .ui-icon-delete, .ui-icon-arrow-r, +.ui-icon-arrow-l, .ui-icon-arrow-u, .ui-icon-arrow-d, .ui-icon-check, +.ui-icon-gear, .ui-icon-refresh, .ui-icon-forward, .ui-icon-back, +.ui-icon-grid, .ui-icon-star, .ui-icon-alert, .ui-icon-info, .ui-icon-home, .ui-icon-search, .ui-icon-searchfield:after, +.ui-icon-checkbox-off, .ui-icon-checkbox-on, .ui-icon-radio-off, .ui-icon-radio-on, .ui-icon-email , .ui-icon-page, +.ui-icon-question , .ui-icon-foursquare, .ui-icon-dollar , .ui-icon-euro, +.ui-icon-pound , .ui-icon-apple , .ui-icon-chat , .ui-icon-trash , .ui-icon-mappin , .ui-icon-direction, +.ui-icon-heart , .ui-icon-wrench , .ui-icon-play , .ui-icon-pause , .ui-icon-stop , .ui-icon-person , .ui-icon-music, +.ui-icon-wifi , .ui-icon-phone , .ui-icon-power , +.ui-icon-lightning , .ui-icon-drink , .ui-icon-android { + background-image: url('images/icons-18-white-pack.png') !important; +} + +@media only screen and (-webkit-min-device-pixel-ratio: 1.3), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min--moz-device-pixel-ratio: 1.3), + only screen and (min-device-pixel-ratio: 1.3), + only screen and (min-resolution: 1.3dppx) { + + .ui-icon-plus, .ui-icon-minus, .ui-icon-delete, .ui-icon-arrow-r, + .ui-icon-arrow-l, .ui-icon-arrow-u, .ui-icon-arrow-d, .ui-icon-check, + .ui-icon-gear, .ui-icon-refresh, .ui-icon-forward, .ui-icon-back, + .ui-icon-grid, .ui-icon-star, .ui-icon-alert, .ui-icon-info, .ui-icon-home, .ui-icon-search, .ui-icon-searchfield:after, + .ui-icon-checkbox-off, .ui-icon-checkbox-on, .ui-icon-radio-off, .ui-icon-radio-on, .ui-icon-email , .ui-icon-page, + .ui-icon-question , .ui-icon-foursquare, .ui-icon-dollar , .ui-icon-euro, + .ui-icon-pound , .ui-icon-apple , .ui-icon-chat , .ui-icon-trash , .ui-icon-mappin , .ui-icon-direction, + .ui-icon-heart , .ui-icon-wrench , .ui-icon-play , .ui-icon-pause , .ui-icon-stop , .ui-icon-person , .ui-icon-music, + .ui-icon-wifi , .ui-icon-phone , .ui-icon-power , + .ui-icon-lightning , .ui-icon-drink , .ui-icon-android { + background-image: url('images/icons-36-white-pack.png') !important; + -moz-background-size: 774px 54px; + -o-background-size: 774px 54px; + -webkit-background-size: 774px 54px; + background-size: 774px 54px; + } + .ui-icon-alt { + background-image: url('images/icons-36-black-pack.png'); + } +} + +/* first row */ +.ui-icon-plus { background-position: 0px 1px !important; } +.ui-icon-minus { background-position: -36px 1px !important; } +.ui-icon-delete { background-position: -71px 1px !important; } +.ui-icon-arrow-r { background-position: -107px 1px !important; } +.ui-icon-arrow-l { background-position: -143px 1px !important; } +.ui-icon-arrow-u { background-position: -179px 1px !important; } +.ui-icon-arrow-d { background-position: -215px 1px !important; } +.ui-icon-check { background-position: -251px 1px !important; } +.ui-icon-gear { background-position: -287px 1px !important; } +.ui-icon-refresh { background-position: -323px 1px !important; } +.ui-icon-forward { background-position: -359px 1px !important; } +.ui-icon-back { background-position: -396px -0 !important; } +.ui-icon-grid { background-position: -431px 1px !important; } +.ui-icon-star { background-position: -467px 1px !important; } +.ui-icon-alert { background-position: -503px 1px !important; } +.ui-icon-info { background-position: -539px 1px !important; } +.ui-icon-home { background-position: -575px 1px !important; } +.ui-icon-search,.ui-icon-searchfield:after { background-position: -611px 0px !important; } +.ui-icon-checkbox-off { background-position: -681px 1px !important; } +.ui-icon-checkbox-on { background-position: -647px 1px !important; } +.ui-icon-radio-off { background-position: -752px 1px !important; } +.ui-icon-radio-on { background-position: -717px 1px !important; } + +/* begin icon pack definitions */ +/* second row */ +.ui-icon-email { background-position: 1px -17px !important; } +.ui-icon-page { background-position: -36px -17px !important; } +.ui-icon-question { background-position: -71px -17px !important; } +.ui-icon-foursquare { background-position: -107px -17px !important; } +.ui-icon-dollar { background-position: -215px -17px !important; } +.ui-icon-euro { background-position: -251px -17px !important; } +.ui-icon-pound { background-position: -287px -17px !important; } +.ui-icon-apple { background-position: -323px -17px !important; } +.ui-icon-chat { background-position: -359px -17px !important; } +.ui-icon-trash { background-position: -395px -17px !important; } +.ui-icon-mappin { background-position: -467px -17px !important; } +.ui-icon-direction { background-position: -503px -17px !important; } +.ui-icon-heart { background-position: -539px -17px !important; } +.ui-icon-wrench { background-position: -575px -17px !important; } +.ui-icon-play { background-position: -611px -17px !important; } +.ui-icon-pause { background-position: -647px -17px !important; } +.ui-icon-stop { background-position: -683px -17px !important; } +.ui-icon-person { background-position: -719px -17px !important; } +.ui-icon-music { background-position: -755px -17px !important; } + +/* third row */ +.ui-icon-wifi { background-position: -35px -34px !important; } +.ui-icon-phone { background-position: -72px -36px !important; } +.ui-icon-power { background-position: -107px -35px !important; } +.ui-icon-lightning { background-position: -251px -35px !important; } +.ui-icon-android { background-position: -323px -35px !important; } + + + + +/* begin primary declarations */ +@font-face { + font-family: 'FontAwesome'; + src: url('font/fontawesome-webfont.eot'); + src: url('font/fontawesome-webfont.eot?#iefix') format('embedded-opentype'), + url('font/fontawesome-webfont.woff') format('woff'), + url('font/fontawesome-webfont.ttf') format('truetype'); + font-weight: normal; + font-style: normal; +} +[class^="ui-icon-"]:before, [class*=" ui-icon-"]:before { + font-family: FontAwesome !important; + font-weight: normal; + font-style: normal; + display: inline-block; +} +.ui-icon:not(.ui-icon-loading), .ui-icon-searchfield::after { + background: #666666; + background: rgba(0, 0, 0, .4); + color: #ffffff; + font-weight: normal; + text-shadow: none; +} +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ +.ui-icon-cloud-download:before { content: "\f0ed"; margin-left: 2px; } +.ui-icon-cloud-upload:before { content: "\f0ee"; margin-left: 2px; } +.ui-icon-lightbulb:before { content: "\f0eb"; margin-top: 1px; margin-left: 3px; } +.ui-icon-exchange:before { content: "\f0ec"; } +.ui-icon-bell-alt:before { content: "\f0f3"; } +.ui-icon-file-alt:before { content: "\f0f6"; } +.ui-icon-beer:before { content: "\f0fc"; margin-top: 1px; margin-left: 2px; } +.ui-icon-coffee:before { content: "\f0f4"; margin-left: 2px; } +.ui-icon-food:before { content: "\f0f5"; margin-top: 1px; margin-left: 4px; } +.ui-icon-fighter-jet:before { content: "\f0fb"; margin-top: 1px; margin-left: 2px; } +.ui-icon-user-md:before { content: "\f0f0"; } +.ui-icon-stethoscope:before { content: "\f0f1"; margin-top: 1px; margin-left: 4px; } +.ui-icon-suitcase:before { content: "\f0f2";; margin-left: 2px; } +.ui-icon-building:before { content: "\f0f7"; } +.ui-icon-hospital:before { content: "\f0f8"; margin-left: 4px; } +.ui-icon-ambulance:before { content: "\f0f9"; margin-top: 1px; margin-left: 1px; } +.ui-icon-medkit:before { content: "\f0fa"; margin-top: 0px; margin-left: 2px; } +.ui-icon-h-sign:before { content: "\f0fd"; } +.ui-icon-plus-sign-alt:before { content: "\f0fe"; } +.ui-icon-spinner:before { content: "\f110"; } +.ui-icon-angle-left:before { content: "\f104"; } +.ui-icon-angle-right:before { content: "\f105"; } +.ui-icon-angle-up:before { content: "\f106"; } +.ui-icon-angle-down:before { content: "\f107"; } +.ui-icon-double-angle-left:before { content: "\f100"; } +.ui-icon-double-angle-right:before { content: "\f101"; margin-left: 4px; } +.ui-icon-double-angle-up:before { content: "\f102"; } +.ui-icon-double-angle-down:before { content: "\f103"; margin-top: 1px; } +.ui-icon-circle-blank:before { content: "\f10c"; } +.ui-icon-circle:before { content: "\f111"; } +.ui-icon-desktop:before { content: "\f108"; margin-top: 1px; margin-left: 2px; } +.ui-icon-laptop:before { content: "\f109"; margin-top: 1px; margin-left: 2px; } +.ui-icon-tablet:before { content: "\f10a"; margin-top: 1px; } +.ui-icon-mobile-phone:before { content: "\f10b"; } +.ui-icon-quote-left:before { content: "\f10d"; } +.ui-icon-quote-right:before { content: "\f10e"; } +.ui-icon-github-alt:before { content: "\f113"; } +.ui-icon-folder-close-alt:before { content: "\f114"; } +.ui-icon-folder-open-alt:before { content: "\f115"; } + +.ui-icon-glass:before { content: "\f000"; margin-top: 2px; } +.ui-icon-music:before { content: "\f001"; margin-left: 1px; margin-top: 2px; } +.ui-icon-fasearch:before { content: "\f002"; } +.ui-icon-envelope:before { content: "\f003"; + margin-left: -1px; + margin-left: 2px; + margin-top: 1px; + } +.ui-icon-heart:before { content: "\f004"; + margin-left: 3px; + margin-top: 2px; + } +.ui-icon-fastar:before { content: "\f005"; } +.ui-icon-star-empty:before { content: "\f006"; } +.ui-icon-user:before { content: "\f007"; margin-left: 4px; } +.ui-icon-film:before { content: "\f008"; margin-left: 2px; } +.ui-icon-th-large:before { content: "\f009"; margin-left: 2px; margin-top: 2px; } +.ui-icon-th:before { content: "\f00a"; margin-left: 3px; margin-top: 2px; } +.ui-icon-th-list:before { content: "\f00b"; margin-left: 3px; margin-top: 2px; } +.ui-icon-ok:before { content: "\f00c"; margin-left: 2px; } +.ui-icon-remove:before { content: "\f00d"; margin-left: 3px; margin-top: 2px; } +.ui-icon-zoom-in:before { content: "\f00e"; } + +.ui-icon-zoom-out:before { content: "\f010"; } +.ui-icon-off:before { content: "\f011"; } +.ui-icon-signal:before { content: "\f012"; margin-left: -1px; } +.ui-icon-cog:before { content: "\f013"; margin-left: 3px; margin-top: 2px; } +.ui-icon-trash:before { content: "\f014"; } +.ui-icon-fahome:before { content: "\f015"; } +.ui-icon-file:before { content: "\f016"; } +.ui-icon-time:before { content: "\f017"; margin-top: 2px; } +.ui-icon-road:before { content: "\f018"; } +.ui-icon-download-alt:before { content: "\f019"; } +.ui-icon-download:before { content: "\f01a"; margin-top: 2px; } +.ui-icon-upload:before { content: "\f01b"; margin-top: 2px; } +.ui-icon-inbox:before { content: "\f01c"; } +.ui-icon-play-circle:before { content: "\f01d"; margin-top: 2px; } +.ui-icon-repeat:before { content: "\f01e"; margin-top: 2px; } + +/* \f020 is not a valid unicode character. all shifted one down */ +.ui-icon-farefresh:before { content: "\f021"; margin-top: 2px; } +.ui-icon-list-alt:before { content: "\f022"; margin-left: 3px; margin-top: 2px; } +.ui-icon-lock:before { content: "\f023"; } +.ui-icon-flag:before { content: "\f024"; margin-top: 2px; } +.ui-icon-headphones:before { content: "\f025"; } +.ui-icon-volume-off:before { content: "\f026"; } +.ui-icon-volume-down:before { content: "\f027"; } +.ui-icon-volume-up:before { content: "\f028"; } +.ui-icon-qrcode:before { content: "\f029"; } +.ui-icon-barcode:before { content: "\f02a"; } +.ui-icon-tag:before { content: "\f02b"; } +.ui-icon-tags:before { content: "\f02c"; } +.ui-icon-book:before { content: "\f02d"; } +.ui-icon-bookmark:before { content: "\f02e"; } +.ui-icon-print:before { content: "\f02f"; } + +.ui-icon-camera:before { content: "\f030"; } +.ui-icon-font:before { content: "\f031"; margin-left: 2px; } +.ui-icon-bold:before { content: "\f032"; margin-left: 2px; } +.ui-icon-italic:before { content: "\f033"; } +.ui-icon-text-height:before { content: "\f034"; } +.ui-icon-text-width:before { content: "\f035"; } +.ui-icon-... [truncated message content] |
From: <com...@bi...> - 2013-05-01 20:12:52
|
1 new commit in vcweb: https://bitbucket.org/virtualcommons/vcweb/commits/48e31ed50bba/ Changeset: 48e31ed50bba User: RoleeSinha Date: 2013-05-01 22:12:26 Summary: lighterprints mobile Affected #: 4 files diff -r b36ce30f6577e2b1e5bea698845285e8be3b1856 -r 48e31ed50bba14b37ecfbbb9852b378fd521bd67 vcweb/lighterprints/templates/lighterprints/mobile/app/controller.js --- /dev/null +++ b/vcweb/lighterprints/templates/lighterprints/mobile/app/controller.js @@ -0,0 +1,124 @@ +var participant_group_id = ''; +var globalViewModel; + +function LighterFootprintsModel(modelJson){ + var self = this; + var model = ko.mapping.fromJS(modelJson); + model.hasGroupActivity = ko.computed(function(){ + return model.groupActivity().length > 0; + }); + model.groupActivityTemplate = function(groupActivity) { + return groupActivity.parameter_name(); + }; + model.teamActivity = ko.computed(function() { + return ko.utils.arrayFilter(model.groupActivity(), function(groupActivity) { + return groupActivity.parameter_name().indexOf("chat_message") != 0; + }); + }); + model.chatMessages = ko.computed(function() { + return ko.utils.arrayFilter(model.groupActivity(), function(groupActivity) { return groupActivity.parameter_name().indexOf("chat_message") === 0 }); + }); + model.hasChatMessages = ko.computed(function() { + return model.chatMessages().length > 0; + }); + model.lockedChallenges = ko.computed(function(){ + return ko.utils.arrayFilter(model.activities(), function(activity){ + return activity.locked() + }); + }); + model.unlockedChallenges = ko.computed(function(){ + return ko.utils.arrayFilter(model.activities(), function(activity){ + return !activity.locked() + }); + }); + model.availableActivities = ko.computed(function(){ + return ko.utils.arrayFilter(model.activities(), function(activity){ + return activity.availableNow() + }); + }); + model.hasAvailableActivities = ko.computed(function(){ + return model.availableActivities().length > 0; + }); + model.lastPerformedActivity = ko.observable(); + + return model; +} + +function initKOModel(response){ + var viewModelData = $.parseJSON(response.view_model_json); + globalViewModel = new LighterFootprintsModel(viewModelData); + // custom view model methods, some of these may be lifted into the model itself + globalViewModel.perform = function(challengeModel){ + if (!challengeModel.availableNow()) { + console.debug("tried to perform an activity that's not available right now"); + console.debug(challengeModel); + return; + } + var id = challengeModel.pk(); + var formData = $('#challengeForm' + id).serialize(); + $.post('http://vcweb.asu.edu/lighterprints/api/do-activity', formData, function(data){ + if (data.success) { + ko.mapping.fromJSON(data.globalViewModel, globalViewModel); + globalViewModel.lastPerformedActivity(challengeModel); + $.mobile.changePage($("#modalPage"),{transition: 'pop', role: 'dialog'}); + } + else { + console.debug("ERROR: " + data.message); + globalViewModel.errorMessage("Unable to perform activity: " + data.message); + $('#activityUnavailableModal').modal(); + } + }); + }; + + ko.applyBindings(globalViewModel); + +} + +$(document).live('pageinit', function(event){ + + $("#submitLogin").click(function(event){ + event.preventDefault(); + + var formData = $("#loginForm").serialize(); + $.ajax({ + type: "POST", + url: "http://vcweb.asu.edu/lighterprints/api/view-model/1005", + cache: false, + data: formData, + dataType: "json", + success: function(data){ + if (data.success == false) { + alert("Invalid login!"); + } + else + if (data.success == true) { + initKOModel(data); + console.debug(data); + $.mobile.changePage($("#dashboardPage")); + } + }, + error: function(form, response){ + alert(response.message); + } + }); + }); + + $("#submitChatMessage").click(function(event){ + event.preventDefault(); + + var formData = $('#chat-form').serialize(); + $.post('https://vcweb.asu.edu/lighterprints/api/message', formData, function(response) { + if (response.success) { + console.debug("successful post - updated view model: "); + ko.mapping.fromJS(response.viewModel, globalViewModel); + } + else { + console.debug("unable to post message to server"); + console.debug(response); + } + }); + $('#chatText').val(''); + return false; + }); + +}); diff -r b36ce30f6577e2b1e5bea698845285e8be3b1856 -r 48e31ed50bba14b37ecfbbb9852b378fd521bd67 vcweb/lighterprints/templates/lighterprints/mobile/app/knockout-2.2.0.js --- /dev/null +++ b/vcweb/lighterprints/templates/lighterprints/mobile/app/knockout-2.2.0.js @@ -0,0 +1,85 @@ +// Knockout JavaScript library v2.2.0 +// (c) Steven Sanderson - http://knockoutjs.com/ +// License: MIT (http://www.opensource.org/licenses/mit-license.php) + +(function() {function i(v){throw v;}var l=!0,n=null,q=!1;function t(v){return function(){return v}};var w=window,x=document,fa=navigator,E=window.jQuery,H=void 0; +function K(v){function ga(a,d,c,e,f){var g=[],a=b.j(function(){var a=d(c,f)||[];0<g.length&&(b.a.Xa(L(g),a),e&&b.r.K(e,n,[c,a,f]));g.splice(0,g.length);b.a.P(g,a)},n,{W:a,Ja:function(){return 0==g.length||!b.a.X(g[0])}});return{M:g,j:a.oa()?a:H}}function L(a){for(;a.length&&!b.a.X(a[0]);)a.splice(0,1);if(1<a.length){for(var d=a[0],c=a[a.length-1],e=[d];d!==c;){d=d.nextSibling;if(!d)return;e.push(d)}Array.prototype.splice.apply(a,[0,a.length].concat(e))}return a}function R(a,b,c,e,f){var g=Math.min, +h=Math.max,j=[],k,m=a.length,p,r=b.length,u=r-m||1,F=m+r+1,I,z,y;for(k=0;k<=m;k++){z=I;j.push(I=[]);y=g(r,k+u);for(p=h(0,k-1);p<=y;p++)I[p]=p?k?a[k-1]===b[p-1]?z[p-1]:g(z[p]||F,I[p-1]||F)+1:p+1:k+1}g=[];h=[];u=[];k=m;for(p=r;k||p;)r=j[k][p]-1,p&&r===j[k][p-1]?h.push(g[g.length]={status:c,value:b[--p],index:p}):k&&r===j[k-1][p]?u.push(g[g.length]={status:e,value:a[--k],index:k}):(g.push({status:"retained",value:b[--p]}),--k);if(h.length&&u.length)for(var a=10*m,s,b=c=0;(f||b<a)&&(s=h[c]);c++){for(e= +0;j=u[e];e++)if(s.value===j.value){s.moved=j.index;j.moved=s.index;u.splice(e,1);b=e=0;break}b+=e}return g.reverse()}function S(a,d,c,e,f){var f=f||{},g=a&&M(a),g=g&&g.ownerDocument,h=f.templateEngine||N;b.ya.ub(c,h,g);c=h.renderTemplate(c,e,f,g);("number"!=typeof c.length||0<c.length&&"number"!=typeof c[0].nodeType)&&i(Error("Template engine must return an array of DOM nodes"));g=q;switch(d){case "replaceChildren":b.e.N(a,c);g=l;break;case "replaceNode":b.a.Xa(a,c);g=l;break;case "ignoreTargetNode":break; +default:i(Error("Unknown renderMode: "+d))}g&&(T(c,e),f.afterRender&&b.r.K(f.afterRender,n,[c,e.$data]));return c}function M(a){return a.nodeType?a:0<a.length?a[0]:n}function T(a,d){if(a.length){var c=a[0],e=a[a.length-1];U(c,e,function(a){b.Ca(d,a)});U(c,e,function(a){b.s.hb(a,[d])})}}function U(a,d,c){for(var e,d=b.e.nextSibling(d);a&&(e=a)!==d;)a=b.e.nextSibling(e),(1===e.nodeType||8===e.nodeType)&&c(e)}function V(a,d,c){for(var a=b.g.aa(a),e=b.g.Q,f=0;f<a.length;f++){var g=a[f].key;if(e.hasOwnProperty(g)){var h= +e[g];"function"===typeof h?(g=h(a[f].value))&&i(Error(g)):h||i(Error("This template engine does not support the '"+g+"' binding within its templates"))}}a="ko.__tr_ambtns(function($context,$element){return(function(){return{ "+b.g.ba(a)+" } })()})";return c.createJavaScriptEvaluatorBlock(a)+d}function W(a,d,c,e){function f(a){return function(){return j[a]}}function g(){return j}var h=0,j,k;b.j(function(){var m=c&&c instanceof b.z?c:new b.z(b.a.d(c)),p=m.$data;e&&b.cb(a,m);if(j=("function"==typeof d? +d(m,a):d)||b.J.instance.getBindings(a,m)){if(0===h){h=1;for(var r in j){var u=b.c[r];u&&8===a.nodeType&&!b.e.I[r]&&i(Error("The binding '"+r+"' cannot be used with virtual elements"));if(u&&"function"==typeof u.init&&(u=(0,u.init)(a,f(r),g,p,m))&&u.controlsDescendantBindings)k!==H&&i(Error("Multiple bindings ("+k+" and "+r+") are trying to control descendant bindings of the same element. You cannot use these bindings together on the same element.")),k=r}h=2}if(2===h)for(r in j)(u=b.c[r])&&"function"== +typeof u.update&&(0,u.update)(a,f(r),g,p,m)}},n,{W:a});return{Mb:k===H}}function X(a,d,c){var e=l,f=1===d.nodeType;f&&b.e.Sa(d);if(f&&c||b.J.instance.nodeHasBindings(d))e=W(d,n,a,c).Mb;e&&Y(a,d,!f)}function Y(a,d,c){for(var e=b.e.firstChild(d);d=e;)e=b.e.nextSibling(d),X(a,d,c)}function Z(a,b){var c=$(a,b);return c?0<c.length?c[c.length-1].nextSibling:a.nextSibling:n}function $(a,b){for(var c=a,e=1,f=[];c=c.nextSibling;){if(G(c)&&(e--,0===e))return f;f.push(c);A(c)&&e++}b||i(Error("Cannot find closing comment tag to match: "+ +a.nodeValue));return n}function G(a){return 8==a.nodeType&&(J?a.text:a.nodeValue).match(ha)}function A(a){return 8==a.nodeType&&(J?a.text:a.nodeValue).match(ia)}function O(a,b){for(var c=n;a!=c;)c=a,a=a.replace(ja,function(a,c){return b[c]});return a}function ka(){var a=[],d=[];this.save=function(c,e){var f=b.a.i(a,c);0<=f?d[f]=e:(a.push(c),d.push(e))};this.get=function(c){c=b.a.i(a,c);return 0<=c?d[c]:H}}function aa(a,b,c){function e(e){var g=b(a[e]);switch(typeof g){case "boolean":case "number":case "string":case "function":f[e]= +g;break;case "object":case "undefined":var h=c.get(g);f[e]=h!==H?h:aa(g,b,c)}}c=c||new ka;a=b(a);if(!("object"==typeof a&&a!==n&&a!==H&&!(a instanceof Date)))return a;var f=a instanceof Array?[]:{};c.save(a,f);var g=a;if(g instanceof Array){for(var h=0;h<g.length;h++)e(h);"function"==typeof g.toJSON&&e("toJSON")}else for(h in g)e(h);return f}function ba(a,d){if(a)if(8==a.nodeType){var c=b.s.Ta(a.nodeValue);c!=n&&d.push({rb:a,Eb:c})}else if(1==a.nodeType)for(var c=0,e=a.childNodes,f=e.length;c<f;c++)ba(e[c], +d)}function P(a,d,c,e){b.c[a]={init:function(a){b.a.f.set(a,ca,{});return{controlsDescendantBindings:l}},update:function(a,g,h,j,k){var h=b.a.f.get(a,ca),g=b.a.d(g()),j=!c!==!g,m=!h.Ya;if(m||d||j!==h.pb)m&&(h.Ya=b.a.Ha(b.e.childNodes(a),l)),j?(m||b.e.N(a,b.a.Ha(h.Ya)),b.Da(e?e(k,g):k,a)):b.e.Y(a),h.pb=j}};b.g.Q[a]=q;b.e.I[a]=l}function da(a,d,c){c&&d!==b.k.q(a)&&b.k.T(a,d);d!==b.k.q(a)&&b.r.K(b.a.Aa,n,[a,"change"])}var b="undefined"!==typeof v?v:{};b.b=function(a,d){for(var c=a.split("."),e=b,f=0;f< +c.length-1;f++)e=e[c[f]];e[c[c.length-1]]=d};b.p=function(a,b,c){a[b]=c};b.version="2.2.0";b.b("version",b.version);b.a=new function(){function a(a,d){if("input"!==b.a.u(a)||!a.type||"click"!=d.toLowerCase())return q;var c=a.type;return"checkbox"==c||"radio"==c}var d=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,c={},e={};c[/Firefox\/2/i.test(fa.userAgent)?"KeyboardEvent":"UIEvents"]=["keyup","keydown","keypress"];c.MouseEvents="click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave".split(" "); +for(var f in c){var g=c[f];if(g.length)for(var h=0,j=g.length;h<j;h++)e[g[h]]=f}var k={propertychange:l},m,c=3;f=x.createElement("div");for(g=f.getElementsByTagName("i");f.innerHTML="<\!--[if gt IE "+ ++c+"]><i></i><![endif]--\>",g[0];);m=4<c?c:H;return{Ma:["authenticity_token",/^__RequestVerificationToken(_.*)?$/],o:function(a,b){for(var d=0,c=a.length;d<c;d++)b(a[d])},i:function(a,b){if("function"==typeof Array.prototype.indexOf)return Array.prototype.indexOf.call(a,b);for(var d=0,c=a.length;d< +c;d++)if(a[d]===b)return d;return-1},kb:function(a,b,d){for(var c=0,e=a.length;c<e;c++)if(b.call(d,a[c]))return a[c];return n},ga:function(a,d){var c=b.a.i(a,d);0<=c&&a.splice(c,1)},Fa:function(a){for(var a=a||[],d=[],c=0,e=a.length;c<e;c++)0>b.a.i(d,a[c])&&d.push(a[c]);return d},V:function(a,b){for(var a=a||[],d=[],c=0,e=a.length;c<e;c++)d.push(b(a[c]));return d},fa:function(a,b){for(var a=a||[],d=[],c=0,e=a.length;c<e;c++)b(a[c])&&d.push(a[c]);return d},P:function(a,b){if(b instanceof Array)a.push.apply(a, +b);else for(var d=0,c=b.length;d<c;d++)a.push(b[d]);return a},extend:function(a,b){if(b)for(var d in b)b.hasOwnProperty(d)&&(a[d]=b[d]);return a},ka:function(a){for(;a.firstChild;)b.removeNode(a.firstChild)},Gb:function(a){for(var a=b.a.L(a),d=x.createElement("div"),c=0,e=a.length;c<e;c++)d.appendChild(b.A(a[c]));return d},Ha:function(a,d){for(var c=0,e=a.length,g=[];c<e;c++){var f=a[c].cloneNode(l);g.push(d?b.A(f):f)}return g},N:function(a,d){b.a.ka(a);if(d)for(var c=0,e=d.length;c<e;c++)a.appendChild(d[c])}, +Xa:function(a,d){var c=a.nodeType?[a]:a;if(0<c.length){for(var e=c[0],g=e.parentNode,f=0,h=d.length;f<h;f++)g.insertBefore(d[f],e);f=0;for(h=c.length;f<h;f++)b.removeNode(c[f])}},ab:function(a,b){7>m?a.setAttribute("selected",b):a.selected=b},D:function(a){return(a||"").replace(d,"")},Qb:function(a,d){for(var c=[],e=(a||"").split(d),f=0,g=e.length;f<g;f++){var h=b.a.D(e[f]);""!==h&&c.push(h)}return c},Nb:function(a,b){a=a||"";return b.length>a.length?q:a.substring(0,b.length)===b},sb:function(a,b){if(b.compareDocumentPosition)return 16== +(b.compareDocumentPosition(a)&16);for(;a!=n;){if(a==b)return l;a=a.parentNode}return q},X:function(a){return b.a.sb(a,a.ownerDocument)},u:function(a){return a&&a.tagName&&a.tagName.toLowerCase()},n:function(b,d,c){var e=m&&k[d];if(!e&&"undefined"!=typeof E){if(a(b,d))var f=c,c=function(a,b){var d=this.checked;b&&(this.checked=b.mb!==l);f.call(this,a);this.checked=d};E(b).bind(d,c)}else!e&&"function"==typeof b.addEventListener?b.addEventListener(d,c,q):"undefined"!=typeof b.attachEvent?b.attachEvent("on"+ +d,function(a){c.call(b,a)}):i(Error("Browser doesn't support addEventListener or attachEvent"))},Aa:function(b,d){(!b||!b.nodeType)&&i(Error("element must be a DOM node when calling triggerEvent"));if("undefined"!=typeof E){var c=[];a(b,d)&&c.push({mb:b.checked});E(b).trigger(d,c)}else"function"==typeof x.createEvent?"function"==typeof b.dispatchEvent?(c=x.createEvent(e[d]||"HTMLEvents"),c.initEvent(d,l,l,w,0,0,0,0,0,q,q,q,q,0,b),b.dispatchEvent(c)):i(Error("The supplied element doesn't support dispatchEvent")): +"undefined"!=typeof b.fireEvent?(a(b,d)&&(b.checked=b.checked!==l),b.fireEvent("on"+d)):i(Error("Browser doesn't support triggering events"))},d:function(a){return b.$(a)?a():a},ta:function(a){return b.$(a)?a.t():a},da:function(a,d,c){if(d){var e=/[\w-]+/g,f=a.className.match(e)||[];b.a.o(d.match(e),function(a){var d=b.a.i(f,a);0<=d?c||f.splice(d,1):c&&f.push(a)});a.className=f.join(" ")}},bb:function(a,d){var c=b.a.d(d);if(c===n||c===H)c="";if(3===a.nodeType)a.data=c;else{var e=b.e.firstChild(a); +!e||3!=e.nodeType||b.e.nextSibling(e)?b.e.N(a,[x.createTextNode(c)]):e.data=c;b.a.vb(a)}},$a:function(a,b){a.name=b;if(7>=m)try{a.mergeAttributes(x.createElement("<input name='"+a.name+"'/>"),q)}catch(d){}},vb:function(a){9<=m&&(a=1==a.nodeType?a:a.parentNode,a.style&&(a.style.zoom=a.style.zoom))},tb:function(a){if(9<=m){var b=a.style.width;a.style.width=0;a.style.width=b}},Kb:function(a,d){for(var a=b.a.d(a),d=b.a.d(d),c=[],e=a;e<=d;e++)c.push(e);return c},L:function(a){for(var b=[],d=0,c=a.length;d< +c;d++)b.push(a[d]);return b},Ob:6===m,Pb:7===m,Z:m,Na:function(a,d){for(var c=b.a.L(a.getElementsByTagName("input")).concat(b.a.L(a.getElementsByTagName("textarea"))),e="string"==typeof d?function(a){return a.name===d}:function(a){return d.test(a.name)},f=[],g=c.length-1;0<=g;g--)e(c[g])&&f.push(c[g]);return f},Hb:function(a){return"string"==typeof a&&(a=b.a.D(a))?w.JSON&&w.JSON.parse?w.JSON.parse(a):(new Function("return "+a))():n},wa:function(a,d,c){("undefined"==typeof JSON||"undefined"==typeof JSON.stringify)&& +i(Error("Cannot find JSON.stringify(). Some browsers (e.g., IE < 8) don't support it natively, but you can overcome this by adding a script reference to json2.js, downloadable from http://www.json.org/json2.js"));return JSON.stringify(b.a.d(a),d,c)},Ib:function(a,d,c){var c=c||{},e=c.params||{},f=c.includeFields||this.Ma,g=a;if("object"==typeof a&&"form"===b.a.u(a))for(var g=a.action,h=f.length-1;0<=h;h--)for(var j=b.a.Na(a,f[h]),k=j.length-1;0<=k;k--)e[j[k].name]=j[k].value;var d=b.a.d(d),m=x.createElement("form"); +m.style.display="none";m.action=g;m.method="post";for(var v in d)a=x.createElement("input"),a.name=v,a.value=b.a.wa(b.a.d(d[v])),m.appendChild(a);for(v in e)a=x.createElement("input"),a.name=v,a.value=e[v],m.appendChild(a);x.body.appendChild(m);c.submitter?c.submitter(m):m.submit();setTimeout(function(){m.parentNode.removeChild(m)},0)}}};b.b("utils",b.a);b.b("utils.arrayForEach",b.a.o);b.b("utils.arrayFirst",b.a.kb);b.b("utils.arrayFilter",b.a.fa);b.b("utils.arrayGetDistinctValues",b.a.Fa);b.b("utils.arrayIndexOf", +b.a.i);b.b("utils.arrayMap",b.a.V);b.b("utils.arrayPushAll",b.a.P);b.b("utils.arrayRemoveItem",b.a.ga);b.b("utils.extend",b.a.extend);b.b("utils.fieldsIncludedWithJsonPost",b.a.Ma);b.b("utils.getFormFields",b.a.Na);b.b("utils.peekObservable",b.a.ta);b.b("utils.postJson",b.a.Ib);b.b("utils.parseJson",b.a.Hb);b.b("utils.registerEventHandler",b.a.n);b.b("utils.stringifyJson",b.a.wa);b.b("utils.range",b.a.Kb);b.b("utils.toggleDomNodeCssClass",b.a.da);b.b("utils.triggerEvent",b.a.Aa);b.b("utils.unwrapObservable", +b.a.d);Function.prototype.bind||(Function.prototype.bind=function(a){var b=this,c=Array.prototype.slice.call(arguments),a=c.shift();return function(){return b.apply(a,c.concat(Array.prototype.slice.call(arguments)))}});b.a.f=new function(){var a=0,d="__ko__"+(new Date).getTime(),c={};return{get:function(a,d){var c=b.a.f.getAll(a,q);return c===H?H:c[d]},set:function(a,d,c){c===H&&b.a.f.getAll(a,q)===H||(b.a.f.getAll(a,l)[d]=c)},getAll:function(b,f){var g=b[d];if(!g||!("null"!==g&&c[g])){if(!f)return H; +g=b[d]="ko"+a++;c[g]={}}return c[g]},clear:function(a){var b=a[d];return b?(delete c[b],a[d]=n,l):q}}};b.b("utils.domData",b.a.f);b.b("utils.domData.clear",b.a.f.clear);b.a.F=new function(){function a(a,d){var e=b.a.f.get(a,c);e===H&&d&&(e=[],b.a.f.set(a,c,e));return e}function d(c){var e=a(c,q);if(e)for(var e=e.slice(0),j=0;j<e.length;j++)e[j](c);b.a.f.clear(c);"function"==typeof E&&"function"==typeof E.cleanData&&E.cleanData([c]);if(f[c.nodeType])for(e=c.firstChild;c=e;)e=c.nextSibling,8===c.nodeType&& +d(c)}var c="__ko_domNodeDisposal__"+(new Date).getTime(),e={1:l,8:l,9:l},f={1:l,9:l};return{Ba:function(b,d){"function"!=typeof d&&i(Error("Callback must be a function"));a(b,l).push(d)},Wa:function(d,e){var f=a(d,q);f&&(b.a.ga(f,e),0==f.length&&b.a.f.set(d,c,H))},A:function(a){if(e[a.nodeType]&&(d(a),f[a.nodeType])){var c=[];b.a.P(c,a.getElementsByTagName("*"));for(var j=0,k=c.length;j<k;j++)d(c[j])}return a},removeNode:function(a){b.A(a);a.parentNode&&a.parentNode.removeChild(a)}}};b.A=b.a.F.A; +b.removeNode=b.a.F.removeNode;b.b("cleanNode",b.A);b.b("removeNode",b.removeNode);b.b("utils.domNodeDisposal",b.a.F);b.b("utils.domNodeDisposal.addDisposeCallback",b.a.F.Ba);b.b("utils.domNodeDisposal.removeDisposeCallback",b.a.F.Wa);b.a.sa=function(a){var d;if("undefined"!=typeof E){if((d=E.clean([a]))&&d[0]){for(a=d[0];a.parentNode&&11!==a.parentNode.nodeType;)a=a.parentNode;a.parentNode&&a.parentNode.removeChild(a)}}else{var c=b.a.D(a).toLowerCase();d=x.createElement("div");c=c.match(/^<(thead|tbody|tfoot)/)&& +[1,"<table>","</table>"]||!c.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!c.indexOf("<td")||!c.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||[0,"",""];a="ignored<div>"+c[1]+a+c[2]+"</div>";for("function"==typeof w.innerShiv?d.appendChild(w.innerShiv(a)):d.innerHTML=a;c[0]--;)d=d.lastChild;d=b.a.L(d.lastChild.childNodes)}return d};b.a.ca=function(a,d){b.a.ka(a);d=b.a.d(d);if(d!==n&&d!==H)if("string"!=typeof d&&(d=d.toString()),"undefined"!=typeof E)E(a).html(d);else for(var c= +b.a.sa(d),e=0;e<c.length;e++)a.appendChild(c[e])};b.b("utils.parseHtmlFragment",b.a.sa);b.b("utils.setHtml",b.a.ca);var Q={};b.s={qa:function(a){"function"!=typeof a&&i(Error("You can only pass a function to ko.memoization.memoize()"));var b=(4294967296*(1+Math.random())|0).toString(16).substring(1)+(4294967296*(1+Math.random())|0).toString(16).substring(1);Q[b]=a;return"<\!--[ko_memo:"+b+"]--\>"},gb:function(a,b){var c=Q[a];c===H&&i(Error("Couldn't find any memo with ID "+a+". Perhaps it's already been unmemoized.")); +try{return c.apply(n,b||[]),l}finally{delete Q[a]}},hb:function(a,d){var c=[];ba(a,c);for(var e=0,f=c.length;e<f;e++){var g=c[e].rb,h=[g];d&&b.a.P(h,d);b.s.gb(c[e].Eb,h);g.nodeValue="";g.parentNode&&g.parentNode.removeChild(g)}},Ta:function(a){return(a=a.match(/^\[ko_memo\:(.*?)\]$/))?a[1]:n}};b.b("memoization",b.s);b.b("memoization.memoize",b.s.qa);b.b("memoization.unmemoize",b.s.gb);b.b("memoization.parseMemoText",b.s.Ta);b.b("memoization.unmemoizeDomNodeAndDescendants",b.s.hb);b.La={throttle:function(a, +d){a.throttleEvaluation=d;var c=n;return b.j({read:a,write:function(b){clearTimeout(c);c=setTimeout(function(){a(b)},d)}})},notify:function(a,d){a.equalityComparer="always"==d?t(q):b.m.fn.equalityComparer;return a}};b.b("extenders",b.La);b.eb=function(a,d,c){this.target=a;this.ha=d;this.qb=c;b.p(this,"dispose",this.B)};b.eb.prototype.B=function(){this.Bb=l;this.qb()};b.S=function(){this.w={};b.a.extend(this,b.S.fn);b.p(this,"subscribe",this.xa);b.p(this,"extend",this.extend);b.p(this,"getSubscriptionsCount", +this.xb)};b.S.fn={xa:function(a,d,c){var c=c||"change",a=d?a.bind(d):a,e=new b.eb(this,a,function(){b.a.ga(this.w[c],e)}.bind(this));this.w[c]||(this.w[c]=[]);this.w[c].push(e);return e},notifySubscribers:function(a,d){d=d||"change";this.w[d]&&b.r.K(function(){b.a.o(this.w[d].slice(0),function(b){b&&b.Bb!==l&&b.ha(a)})},this)},xb:function(){var a=0,b;for(b in this.w)this.w.hasOwnProperty(b)&&(a+=this.w[b].length);return a},extend:function(a){var d=this;if(a)for(var c in a){var e=b.La[c];"function"== +typeof e&&(d=e(d,a[c]))}return d}};b.Pa=function(a){return"function"==typeof a.xa&&"function"==typeof a.notifySubscribers};b.b("subscribable",b.S);b.b("isSubscribable",b.Pa);var B=[];b.r={lb:function(a){B.push({ha:a,Ka:[]})},end:function(){B.pop()},Va:function(a){b.Pa(a)||i(Error("Only subscribable things can act as dependencies"));if(0<B.length){var d=B[B.length-1];d&&!(0<=b.a.i(d.Ka,a))&&(d.Ka.push(a),d.ha(a))}},K:function(a,b,c){try{return B.push(n),a.apply(b,c||[])}finally{B.pop()}}};var la={undefined:l, +"boolean":l,number:l,string:l};b.m=function(a){function d(){if(0<arguments.length){if(!d.equalityComparer||!d.equalityComparer(c,arguments[0]))d.H(),c=arguments[0],d.G();return this}b.r.Va(d);return c}var c=a;b.S.call(d);d.t=function(){return c};d.G=function(){d.notifySubscribers(c)};d.H=function(){d.notifySubscribers(c,"beforeChange")};b.a.extend(d,b.m.fn);b.p(d,"peek",d.t);b.p(d,"valueHasMutated",d.G);b.p(d,"valueWillMutate",d.H);return d};b.m.fn={equalityComparer:function(a,b){return a===n||typeof a in +la?a===b:q}};var D=b.m.Jb="__ko_proto__";b.m.fn[D]=b.m;b.la=function(a,d){return a===n||a===H||a[D]===H?q:a[D]===d?l:b.la(a[D],d)};b.$=function(a){return b.la(a,b.m)};b.Qa=function(a){return"function"==typeof a&&a[D]===b.m||"function"==typeof a&&a[D]===b.j&&a.yb?l:q};b.b("observable",b.m);b.b("isObservable",b.$);b.b("isWriteableObservable",b.Qa);b.R=function(a){0==arguments.length&&(a=[]);a!==n&&(a!==H&&!("length"in a))&&i(Error("The argument passed when initializing an observable array must be an array, or null, or undefined.")); +var d=b.m(a);b.a.extend(d,b.R.fn);return d};b.R.fn={remove:function(a){for(var b=this.t(),c=[],e="function"==typeof a?a:function(b){return b===a},f=0;f<b.length;f++){var g=b[f];e(g)&&(0===c.length&&this.H(),c.push(g),b.splice(f,1),f--)}c.length&&this.G();return c},removeAll:function(a){if(a===H){var d=this.t(),c=d.slice(0);this.H();d.splice(0,d.length);this.G();return c}return!a?[]:this.remove(function(d){return 0<=b.a.i(a,d)})},destroy:function(a){var b=this.t(),c="function"==typeof a?a:function(b){return b=== +a};this.H();for(var e=b.length-1;0<=e;e--)c(b[e])&&(b[e]._destroy=l);this.G()},destroyAll:function(a){return a===H?this.destroy(t(l)):!a?[]:this.destroy(function(d){return 0<=b.a.i(a,d)})},indexOf:function(a){var d=this();return b.a.i(d,a)},replace:function(a,b){var c=this.indexOf(a);0<=c&&(this.H(),this.t()[c]=b,this.G())}};b.a.o("pop push reverse shift sort splice unshift".split(" "),function(a){b.R.fn[a]=function(){var b=this.t();this.H();b=b[a].apply(b,arguments);this.G();return b}});b.a.o(["slice"], +function(a){b.R.fn[a]=function(){var b=this();return b[a].apply(b,arguments)}});b.b("observableArray",b.R);b.j=function(a,d,c){function e(){b.a.o(y,function(a){a.B()});y=[]}function f(){var a=h.throttleEvaluation;a&&0<=a?(clearTimeout(s),s=setTimeout(g,a)):g()}function g(){if(!p)if(m&&v())z();else{p=l;try{var a=b.a.V(y,function(a){return a.target});b.r.lb(function(c){var d;0<=(d=b.a.i(a,c))?a[d]=H:y.push(c.xa(f))});for(var c=r.call(d),e=a.length-1;0<=e;e--)a[e]&&y.splice(e,1)[0].B();m=l;h.notifySubscribers(k, +"beforeChange");k=c}finally{b.r.end()}h.notifySubscribers(k);p=q;y.length||z()}}function h(){if(0<arguments.length)return"function"===typeof u?u.apply(d,arguments):i(Error("Cannot write a value to a ko.computed unless you specify a 'write' option. If you wish to read the current value, don't pass any parameters.")),this;m||g();b.r.Va(h);return k}function j(){return!m||0<y.length}var k,m=q,p=q,r=a;r&&"object"==typeof r?(c=r,r=c.read):(c=c||{},r||(r=c.read));"function"!=typeof r&&i(Error("Pass a function that returns the value of the ko.computed")); +var u=c.write,F=c.disposeWhenNodeIsRemoved||c.W||n,v=c.disposeWhen||c.Ja||t(q),z=e,y=[],s=n;d||(d=c.owner);h.t=function(){m||g();return k};h.wb=function(){return y.length};h.yb="function"===typeof c.write;h.B=function(){z()};h.oa=j;b.S.call(h);b.a.extend(h,b.j.fn);b.p(h,"peek",h.t);b.p(h,"dispose",h.B);b.p(h,"isActive",h.oa);b.p(h,"getDependenciesCount",h.wb);c.deferEvaluation!==l&&g();if(F&&j()){z=function(){b.a.F.Wa(F,arguments.callee);e()};b.a.F.Ba(F,z);var C=v,v=function(){return!b.a.X(F)||C()}}return h}; +b.Ab=function(a){return b.la(a,b.j)};v=b.m.Jb;b.j[v]=b.m;b.j.fn={};b.j.fn[v]=b.j;b.b("dependentObservable",b.j);b.b("computed",b.j);b.b("isComputed",b.Ab);b.fb=function(a){0==arguments.length&&i(Error("When calling ko.toJS, pass the object you want to convert."));return aa(a,function(a){for(var c=0;b.$(a)&&10>c;c++)a=a();return a})};b.toJSON=function(a,d,c){a=b.fb(a);return b.a.wa(a,d,c)};b.b("toJS",b.fb);b.b("toJSON",b.toJSON);b.k={q:function(a){switch(b.a.u(a)){case "option":return a.__ko__hasDomDataOptionValue__=== +l?b.a.f.get(a,b.c.options.ra):7>=b.a.Z?a.getAttributeNode("value").specified?a.value:a.text:a.value;case "select":return 0<=a.selectedIndex?b.k.q(a.options[a.selectedIndex]):H;default:return a.value}},T:function(a,d){switch(b.a.u(a)){case "option":switch(typeof d){case "string":b.a.f.set(a,b.c.options.ra,H);"__ko__hasDomDataOptionValue__"in a&&delete a.__ko__hasDomDataOptionValue__;a.value=d;break;default:b.a.f.set(a,b.c.options.ra,d),a.__ko__hasDomDataOptionValue__=l,a.value="number"===typeof d? +d:""}break;case "select":for(var c=a.options.length-1;0<=c;c--)if(b.k.q(a.options[c])==d){a.selectedIndex=c;break}break;default:if(d===n||d===H)d="";a.value=d}}};b.b("selectExtensions",b.k);b.b("selectExtensions.readValue",b.k.q);b.b("selectExtensions.writeValue",b.k.T);var ja=/\@ko_token_(\d+)\@/g,ma=["true","false"],na=/^(?:[$_a-z][$\w]*|(.+)(\.\s*[$_a-z][$\w]*|\[.+\]))$/i;b.g={Q:[],aa:function(a){var d=b.a.D(a);if(3>d.length)return[];"{"===d.charAt(0)&&(d=d.substring(1,d.length-1));for(var a=[], +c=n,e,f=0;f<d.length;f++){var g=d.charAt(f);if(c===n)switch(g){case '"':case "'":case "/":c=f,e=g}else if(g==e&&"\\"!==d.charAt(f-1)){g=d.substring(c,f+1);a.push(g);var h="@ko_token_"+(a.length-1)+"@",d=d.substring(0,c)+h+d.substring(f+1),f=f-(g.length-h.length),c=n}}e=c=n;for(var j=0,k=n,f=0;f<d.length;f++){g=d.charAt(f);if(c===n)switch(g){case "{":c=f;k=g;e="}";break;case "(":c=f;k=g;e=")";break;case "[":c=f,k=g,e="]"}g===k?j++:g===e&&(j--,0===j&&(g=d.substring(c,f+1),a.push(g),h="@ko_token_"+(a.length- +1)+"@",d=d.substring(0,c)+h+d.substring(f+1),f-=g.length-h.length,c=n))}e=[];d=d.split(",");c=0;for(f=d.length;c<f;c++)j=d[c],k=j.indexOf(":"),0<k&&k<j.length-1?(g=j.substring(k+1),e.push({key:O(j.substring(0,k),a),value:O(g,a)})):e.push({unknown:O(j,a)});return e},ba:function(a){for(var d="string"===typeof a?b.g.aa(a):a,c=[],a=[],e,f=0;e=d[f];f++)if(0<c.length&&c.push(","),e.key){var g;a:{g=e.key;var h=b.a.D(g);switch(h.length&&h.charAt(0)){case "'":case '"':break a;default:g="'"+h+"'"}}e=e.value; +c.push(g);c.push(":");c.push(e);e=b.a.D(e);0<=b.a.i(ma,b.a.D(e).toLowerCase())?e=q:(h=e.match(na),e=h===n?q:h[1]?"Object("+h[1]+")"+h[2]:e);e&&(0<a.length&&a.push(", "),a.push(g+" : function(__ko_value) { "+e+" = __ko_value; }"))}else e.unknown&&c.push(e.unknown);d=c.join("");0<a.length&&(d=d+", '_ko_property_writers' : { "+a.join("")+" } ");return d},Db:function(a,d){for(var c=0;c<a.length;c++)if(b.a.D(a[c].key)==d)return l;return q},ea:function(a,d,c,e,f){if(!a||!b.Qa(a)){if((a=d()._ko_property_writers)&& +a[c])a[c](e)}else(!f||a.t()!==e)&&a(e)}};b.b("expressionRewriting",b.g);b.b("expressionRewriting.bindingRewriteValidators",b.g.Q);b.b("expressionRewriting.parseObjectLiteral",b.g.aa);b.b("expressionRewriting.preProcessBindings",b.g.ba);b.b("jsonExpressionRewriting",b.g);b.b("jsonExpressionRewriting.insertPropertyAccessorsIntoJson",b.g.ba);var J="<\!--test--\>"===x.createComment("test").text,ia=J?/^<\!--\s*ko(?:\s+(.+\s*\:[\s\S]*))?\s*--\>$/:/^\s*ko(?:\s+(.+\s*\:[\s\S]*))?\s*$/,ha=J?/^<\!--\s*\/ko\s*--\>$/: +/^\s*\/ko\s*$/,oa={ul:l,ol:l};b.e={I:{},childNodes:function(a){return A(a)?$(a):a.childNodes},Y:function(a){if(A(a))for(var a=b.e.childNodes(a),d=0,c=a.length;d<c;d++)b.removeNode(a[d]);else b.a.ka(a)},N:function(a,d){if(A(a)){b.e.Y(a);for(var c=a.nextSibling,e=0,f=d.length;e<f;e++)c.parentNode.insertBefore(d[e],c)}else b.a.N(a,d)},Ua:function(a,b){A(a)?a.parentNode.insertBefore(b,a.nextSibling):a.firstChild?a.insertBefore(b,a.firstChild):a.appendChild(b)},Oa:function(a,d,c){c?A(a)?a.parentNode.insertBefore(d, +c.nextSibling):c.nextSibling?a.insertBefore(d,c.nextSibling):a.appendChild(d):b.e.Ua(a,d)},firstChild:function(a){return!A(a)?a.firstChild:!a.nextSibling||G(a.nextSibling)?n:a.nextSibling},nextSibling:function(a){A(a)&&(a=Z(a));return a.nextSibling&&G(a.nextSibling)?n:a.nextSibling},ib:function(a){return(a=A(a))?a[1]:n},Sa:function(a){if(oa[b.a.u(a)]){var d=a.firstChild;if(d){do if(1===d.nodeType){var c;c=d.firstChild;var e=n;if(c){do if(e)e.push(c);else if(A(c)){var f=Z(c,l);f?c=f:e=[c]}else G(c)&& +(e=[c]);while(c=c.nextSibling)}if(c=e){e=d.nextSibling;for(f=0;f<c.length;f++)e?a.insertBefore(c[f],e):a.appendChild(c[f])}}while(d=d.nextSibling)}}}};b.b("virtualElements",b.e);b.b("virtualElements.allowedBindings",b.e.I);b.b("virtualElements.emptyNode",b.e.Y);b.b("virtualElements.insertAfter",b.e.Oa);b.b("virtualElements.prepend",b.e.Ua);b.b("virtualElements.setDomNodeChildren",b.e.N);b.J=function(){this.Ga={}};b.a.extend(b.J.prototype,{nodeHasBindings:function(a){switch(a.nodeType){case 1:return a.getAttribute("data-bind")!= +n;case 8:return b.e.ib(a)!=n;default:return q}},getBindings:function(a,b){var c=this.getBindingsString(a,b);return c?this.parseBindingsString(c,b,a):n},getBindingsString:function(a){switch(a.nodeType){case 1:return a.getAttribute("data-bind");case 8:return b.e.ib(a);default:return n}},parseBindingsString:function(a,d,c){try{var e;if(!(e=this.Ga[a])){var f=this.Ga,g="with($context){with($data||{}){return{"+b.g.ba(a)+"}}}";e=f[a]=new Function("$context","$element",g)}return e(d,c)}catch(h){i(Error("Unable to parse bindings.\nMessage: "+ +h+";\nBindings value: "+a))}}});b.J.instance=new b.J;b.b("bindingProvider",b.J);b.c={};b.z=function(a,d,c){d?(b.a.extend(this,d),this.$parentContext=d,this.$parent=d.$data,this.$parents=(d.$parents||[]).slice(0),this.$parents.unshift(this.$parent)):(this.$parents=[],this.$root=a,this.ko=b);this.$data=a;c&&(this[c]=a)};b.z.prototype.createChildContext=function(a,d){return new b.z(a,this,d)};b.z.prototype.extend=function(a){var d=b.a.extend(new b.z,this);return b.a.extend(d,a)};b.cb=function(a,d){if(2== +arguments.length)b.a.f.set(a,"__ko_bindingContext__",d);else return b.a.f.get(a,"__ko_bindingContext__")};b.Ea=function(a,d,c){1===a.nodeType&&b.e.Sa(a);return W(a,d,c,l)};b.Da=function(a,b){(1===b.nodeType||8===b.nodeType)&&Y(a,b,l)};b.Ca=function(a,b){b&&(1!==b.nodeType&&8!==b.nodeType)&&i(Error("ko.applyBindings: first parameter should be your view model; second parameter should be a DOM node"));b=b||w.document.body;X(a,b,l)};b.ja=function(a){switch(a.nodeType){case 1:case 8:var d=b.cb(a);if(d)return d; +if(a.parentNode)return b.ja(a.parentNode)}return H};b.ob=function(a){return(a=b.ja(a))?a.$data:H};b.b("bindingHandlers",b.c);b.b("applyBindings",b.Ca);b.b("applyBindingsToDescendants",b.Da);b.b("applyBindingsToNode",b.Ea);b.b("contextFor",b.ja);b.b("dataFor",b.ob);var ea={"class":"className","for":"htmlFor"};b.c.attr={update:function(a,d){var c=b.a.d(d())||{},e;for(e in c)if("string"==typeof e){var f=b.a.d(c[e]),g=f===q||f===n||f===H;g&&a.removeAttribute(e);8>=b.a.Z&&e in ea?(e=ea[e],g?a.removeAttribute(e): +a[e]=f):g||a.setAttribute(e,f.toString());"name"===e&&b.a.$a(a,g?"":f.toString())}}};b.c.checked={init:function(a,d,c){b.a.n(a,"click",function(){var e;if("checkbox"==a.type)e=a.checked;else if("radio"==a.type&&a.checked)e=a.value;else return;var f=d(),g=b.a.d(f);"checkbox"==a.type&&g instanceof Array?(e=b.a.i(g,a.value),a.checked&&0>e?f.push(a.value):!a.checked&&0<=e&&f.splice(e,1)):b.g.ea(f,c,"checked",e,l)});"radio"==a.type&&!a.name&&b.c.uniqueName.init(a,t(l))},update:function(a,d){var c=b.a.d(d()); +"checkbox"==a.type?a.checked=c instanceof Array?0<=b.a.i(c,a.value):c:"radio"==a.type&&(a.checked=a.value==c)}};b.c.css={update:function(a,d){var c=b.a.d(d());if("object"==typeof c)for(var e in c){var f=b.a.d(c[e]);b.a.da(a,e,f)}else c=String(c||""),b.a.da(a,a.__ko__cssValue,q),a.__ko__cssValue=c,b.a.da(a,c,l)}};b.c.enable={update:function(a,d){var c=b.a.d(d());c&&a.disabled?a.removeAttribute("disabled"):!c&&!a.disabled&&(a.disabled=l)}};b.c.disable={update:function(a,d){b.c.enable.update(a,function(){return!b.a.d(d())})}}; +b.c.event={init:function(a,d,c,e){var f=d()||{},g;for(g in f)(function(){var f=g;"string"==typeof f&&b.a.n(a,f,function(a){var g,m=d()[f];if(m){var p=c();try{var r=b.a.L(arguments);r.unshift(e);g=m.apply(e,r)}finally{g!==l&&(a.preventDefault?a.preventDefault():a.returnValue=q)}p[f+"Bubble"]===q&&(a.cancelBubble=l,a.stopPropagation&&a.stopPropagation())}})})()}};b.c.foreach={Ra:function(a){return function(){var d=a(),c=b.a.ta(d);if(!c||"number"==typeof c.length)return{foreach:d,templateEngine:b.C.na}; +b.a.d(d);return{foreach:c.data,as:c.as,includeDestroyed:c.includeDestroyed,afterAdd:c.afterAdd,beforeRemove:c.beforeRemove,afterRender:c.afterRender,beforeMove:c.beforeMove,afterMove:c.afterMove,templateEngine:b.C.na}}},init:function(a,d){return b.c.template.init(a,b.c.foreach.Ra(d))},update:function(a,d,c,e,f){return b.c.template.update(a,b.c.foreach.Ra(d),c,e,f)}};b.g.Q.foreach=q;b.e.I.foreach=l;b.c.hasfocus={init:function(a,d,c){function e(e){a.__ko_hasfocusUpdating=l;var f=a.ownerDocument;"activeElement"in +f&&(e=f.activeElement===a);f=d();b.g.ea(f,c,"hasfocus",e,l);a.__ko_hasfocusUpdating=q}var f=e.bind(n,l),g=e.bind(n,q);b.a.n(a,"focus",f);b.a.n(a,"focusin",f);b.a.n(a,"blur",g);b.a.n(a,"focusout",g)},update:function(a,d){var c=b.a.d(d());a.__ko_hasfocusUpdating||(c?a.focus():a.blur(),b.r.K(b.a.Aa,n,[a,c?"focusin":"focusout"]))}};b.c.html={init:function(){return{controlsDescendantBindings:l}},update:function(a,d){b.a.ca(a,d())}};var ca="__ko_withIfBindingData";P("if");P("ifnot",q,l);P("with",l,q,function(a, +b){return a.createChildContext(b)});b.c.options={update:function(a,d,c){"select"!==b.a.u(a)&&i(Error("options binding applies only to SELECT elements"));for(var e=0==a.length,f=b.a.V(b.a.fa(a.childNodes,function(a){return a.tagName&&"option"===b.a.u(a)&&a.selected}),function(a){return b.k.q(a)||a.innerText||a.textContent}),g=a.scrollTop,h=b.a.d(d());0<a.length;)b.A(a.options[0]),a.remove(0);if(h){var c=c(),j=c.optionsIncludeDestroyed;"number"!=typeof h.length&&(h=[h]);if(c.optionsCaption){var k=x.createElement("option"); +b.a.ca(k,c.optionsCaption);b.k.T(k,H);a.appendChild(k)}for(var d=0,m=h.length;d<m;d++){var p=h[d];if(!p||!p._destroy||j){var k=x.createElement("option"),r=function(a,b,c){var d=typeof b;return"function"==d?b(a):"string"==d?a[b]:c},u=r(p,c.optionsValue,p);b.k.T(k,b.a.d(u));p=r(p,c.optionsText,u);b.a.bb(k,p);a.appendChild(k)}}h=a.getElementsByTagName("option");d=j=0;for(m=h.length;d<m;d++)0<=b.a.i(f,b.k.q(h[d]))&&(b.a.ab(h[d],l),j++);a.scrollTop=g;e&&"value"in c&&da(a,b.a.ta(c.value),l);b.a.tb(a)}}}; +b.c.options.ra="__ko.optionValueDomData__";b.c.selectedOptions={init:function(a,d,c){b.a.n(a,"change",function(){var e=d(),f=[];b.a.o(a.getElementsByTagName("option"),function(a){a.selected&&f.push(b.k.q(a))});b.g.ea(e,c,"value",f)})},update:function(a,d){"select"!=b.a.u(a)&&i(Error("values binding applies only to SELECT elements"));var c=b.a.d(d());c&&"number"==typeof c.length&&b.a.o(a.getElementsByTagName("option"),function(a){var d=0<=b.a.i(c,b.k.q(a));b.a.ab(a,d)})}};b.c.style={update:function(a, +d){var c=b.a.d(d()||{}),e;for(e in c)if("string"==typeof e){var f=b.a.d(c[e]);a.style[e]=f||""}}};b.c.submit={init:function(a,d,c,e){"function"!=typeof d()&&i(Error("The value for a submit binding must be a function"));b.a.n(a,"submit",function(b){var c,h=d();try{c=h.call(e,a)}finally{c!==l&&(b.preventDefault?b.preventDefault():b.returnValue=q)}})}};b.c.text={update:function(a,d){b.a.bb(a,d())}};b.e.I.text=l;b.c.uniqueName={init:function(a,d){if(d()){var c="ko_unique_"+ ++b.c.uniqueName.nb;b.a.$a(a, +c)}}};b.c.uniqueName.nb=0;b.c.value={init:function(a,d,c){function e(){h=q;var e=d(),f=b.k.q(a);b.g.ea(e,c,"value",f)}var f=["change"],g=c().valueUpdate,h=q;g&&("string"==typeof g&&(g=[g]),b.a.P(f,g),f=b.a.Fa(f));if(b.a.Z&&("input"==a.tagName.toLowerCase()&&"text"==a.type&&"off"!=a.autocomplete&&(!a.form||"off"!=a.form.autocomplete))&&-1==b.a.i(f,"propertychange"))b.a.n(a,"propertychange",function(){h=l}),b.a.n(a,"blur",function(){h&&e()});b.a.o(f,function(c){var d=e;b.a.Nb(c,"after")&&(d=function(){setTimeout(e, +0)},c=c.substring(5));b.a.n(a,c,d)})},update:function(a,d){var c="select"===b.a.u(a),e=b.a.d(d()),f=b.k.q(a),g=e!=f;0===e&&(0!==f&&"0"!==f)&&(g=l);g&&(f=function(){b.k.T(a,e)},f(),c&&setTimeout(f,0));c&&0<a.length&&da(a,e,q)}};b.c.visible={update:function(a,d){var c=b.a.d(d()),e="none"!=a.style.display;c&&!e?a.style.display="":!c&&e&&(a.style.display="none")}};b.c.click={init:function(a,d,c,e){return b.c.event.init.call(this,a,function(){var a={};a.click=d();return a},c,e)}};b.v=function(){};b.v.prototype.renderTemplateSource= +function(){i(Error("Override renderTemplateSource"))};b.v.prototype.createJavaScriptEvaluatorBlock=function(){i(Error("Override createJavaScriptEvaluatorBlock"))};b.v.prototype.makeTemplateSource=function(a,d){if("string"==typeof a){var d=d||x,c=d.getElementById(a);c||i(Error("Cannot find template with ID "+a));return new b.l.h(c)}if(1==a.nodeType||8==a.nodeType)return new b.l.O(a);i(Error("Unknown template type: "+a))};b.v.prototype.renderTemplate=function(a,b,c,e){a=this.makeTemplateSource(a,e); +return this.renderTemplateSource(a,b,c)};b.v.prototype.isTemplateRewritten=function(a,b){return this.allowTemplateRewriting===q?l:this.makeTemplateSource(a,b).data("isRewritten")};b.v.prototype.rewriteTemplate=function(a,b,c){a=this.makeTemplateSource(a,c);b=b(a.text());a.text(b);a.data("isRewritten",l)};b.b("templateEngine",b.v);var pa=/(<[a-z]+\d*(\s+(?!data-bind=)[a-z0-9\-]+(=(\"[^\"]*\"|\'[^\']*\'))?)*\s+)data-bind=(["'])([\s\S]*?)\5/gi,qa=/<\!--\s*ko\b\s*([\s\S]*?)\s*--\>/g;b.ya={ub:function(a, +d,c){d.isTemplateRewritten(a,c)||d.rewriteTemplate(a,function(a){return b.ya.Fb(a,d)},c)},Fb:function(a,b){return a.replace(pa,function(a,e,f,g,h,j,k){return V(k,e,b)}).replace(qa,function(a,e){return V(e,"<\!-- ko --\>",b)})},jb:function(a){return b.s.qa(function(d,c){d.nextSibling&&b.Ea(d.nextSibling,a,c)})}};b.b("__tr_ambtns",b.ya.jb);b.l={};b.l.h=function(a){this.h=a};b.l.h.prototype.text=function(){var a=b.a.u(this.h),a="script"===a?"text":"textarea"===a?"value":"innerHTML";if(0==arguments.length)return this.h[a]; +var d=arguments[0];"innerHTML"===a?b.a.ca(this.h,d):this.h[a]=d};b.l.h.prototype.data=function(a){if(1===arguments.length)return b.a.f.get(this.h,"templateSourceData_"+a);b.a.f.set(this.h,"templateSourceData_"+a,arguments[1])};b.l.O=function(a){this.h=a};b.l.O.prototype=new b.l.h;b.l.O.prototype.text=function(){if(0==arguments.length){var a=b.a.f.get(this.h,"__ko_anon_template__")||{};a.za===H&&a.ia&&(a.za=a.ia.innerHTML);return a.za}b.a.f.set(this.h,"__ko_anon_template__",{za:arguments[0]})};b.l.h.prototype.nodes= +function(){if(0==arguments.length)return(b.a.f.get(this.h,"__ko_anon_template__")||{}).ia;b.a.f.set(this.h,"__ko_anon_template__",{ia:arguments[0]})};b.b("templateSources",b.l);b.b("templateSources.domElement",b.l.h);b.b("templateSources.anonymousTemplate",b.l.O);var N;b.va=function(a){a!=H&&!(a instanceof b.v)&&i(Error("templateEngine must inherit from ko.templateEngine"));N=a};b.ua=function(a,d,c,e,f){c=c||{};(c.templateEngine||N)==H&&i(Error("Set a template engine before calling renderTemplate")); +f=f||"replaceChildren";if(e){var g=M(e);return b.j(function(){var h=d&&d instanceof b.z?d:new b.z(b.a.d(d)),j="function"==typeof a?a(h.$data,h):a,h=S(e,f,j,h,c);"replaceNode"==f&&(e=h,g=M(e))},n,{Ja:function(){return!g||!b.a.X(g)},W:g&&"replaceNode"==f?g.parentNode:g})}return b.s.qa(function(e){b.ua(a,d,c,e,"replaceNode")})};b.Lb=function(a,d,c,e,f){function g(a,b){T(b,j);c.afterRender&&c.afterRender(b,a)}function h(d,e){j=f.createChildContext(b.a.d(d),c.as);j.$index=e;var g="function"==typeof a? +a(d,j):a;return S(n,"ignoreTargetNode",g,j,c)}var j;return b.j(function(){var a=b.a.d(d)||[];"undefined"==typeof a.length&&(a=[a]);a=b.a.fa(a,function(a){return c.includeDestroyed||a===H||a===n||!b.a.d(a._destroy)});b.r.K(b.a.Za,n,[e,a,h,c,g])},n,{W:e})};b.c.template={init:function(a,d){var c=b.a.d(d());if("string"!=typeof c&&!c.name&&(1==a.nodeType||8==a.nodeType))c=1==a.nodeType?a.childNodes:b.e.childNodes(a),c=b.a.Gb(c),(new b.l.O(a)).nodes(c);return{controlsDescendantBindings:l}},update:function(a, +d,c,e,f){var d=b.a.d(d()),c={},e=l,g,h=n;"string"!=typeof d&&(c=d,d=c.name,"if"in c&&(e=b.a.d(c["if"])),e&&"ifnot"in c&&(e=!b.a.d(c.ifnot)),g=b.a.d(c.data));"foreach"in c?h=b.Lb(d||a,e&&c.foreach||[],c,a,f):e?(f="data"in c?f.createChildContext(g,c.as):f,h=b.ua(d||a,f,c,a)):b.e.Y(a);f=h;(g=b.a.f.get(a,"__ko__templateComputedDomDataKey__"))&&"function"==typeof g.B&&g.B();b.a.f.set(a,"__ko__templateComputedDomDataKey__",f&&f.oa()?f:H)}};b.g.Q.template=function(a){a=b.g.aa(a);return 1==a.length&&a[0].unknown|| +b.g.Db(a,"name")?n:"This template engine does not support anonymous templates nested within its templates"};b.e.I.template=l;b.b("setTemplateEngine",b.va);b.b("renderTemplate",b.ua);b.a.Ia=function(a,b,c){a=a||[];b=b||[];return a.length<=b.length?R(a,b,"added","deleted",c):R(b,a,"deleted","added",c)};b.b("utils.compareArrays",b.a.Ia);b.a.Za=function(a,d,c,e,f){function g(a,b){s=k[b];v!==b&&(y[a]=s);s.ma(v++);L(s.M);r.push(s);z.push(s)}function h(a,c){if(a)for(var d=0,e=c.length;d<e;d++)c[d]&&b.a.o(c[d].M, +function(b){a(b,d,c[d].U)})}for(var d=d||[],e=e||{},j=b.a.f.get(a,"setDomNodeChildrenFromArrayMapping_lastMappingResult")===H,k=b.a.f.get(a,"setDomNodeChildrenFromArrayMapping_lastMappingResult")||[],m=b.a.V(k,function(a){return a.U}),p=b.a.Ia(m,d),r=[],u=0,v=0,A=[],z=[],d=[],y=[],m=[],s,C=0,B,D;B=p[C];C++)switch(D=B.moved,B.status){case "deleted":D===H&&(s=k[u],s.j&&s.j.B(),A.push.apply(A,L(s.M)),e.beforeRemove&&(d[C]=s,z.push(s)));u++;break;case "retained":g(C,u++);break;case "added":D!==H?g(C, +D):(s={U:B.value,ma:b.m(v++)},r.push(s),z.push(s),j||(m[C]=s))}h(e.beforeMove,y);b.a.o(A,e.beforeRemove?b.A:b.removeNode);for(var C=0,j=b.e.firstChild(a),G;s=z[C];C++){s.M||b.a.extend(s,ga(a,c,s.U,f,s.ma));for(u=0;p=s.M[u];j=p.nextSibling,G=p,u++)p!==j&&b.e.Oa(a,p,G);!s.zb&&f&&(f(s.U,s.M,s.ma),s.zb=l)}h(e.beforeRemove,d);h(e.afterMove,y);h(e.afterAdd,m);b.a.f.set(a,"setDomNodeChildrenFromArrayMapping_lastMappingResult",r)};b.b("utils.setDomNodeChildrenFromArrayMapping",b.a.Za);b.C=function(){this.allowTemplateRewriting= +q};b.C.prototype=new b.v;b.C.prototype.renderTemplateSource=function(a){var d=!(9>b.a.Z)&&a.nodes?a.nodes():n;if(d)return b.a.L(d.cloneNode(l).childNodes);a=a.text();return b.a.sa(a)};b.C.na=new b.C;b.va(b.C.na);b.b("nativeTemplateEngine",b.C);b.pa=function(){var a=this.Cb=function(){if("undefined"==typeof E||!E.tmpl)return 0;try{if(0<=E.tmpl.tag.tmpl.open.toString().indexOf("__"))return 2}catch(a){}return 1}();this.renderTemplateSource=function(b,c,e){e=e||{};2>a&&i(Error("Your version of jQuery.tmpl is too old. Please upgrade to jQuery.tmpl 1.0.0pre or later.")); +var f=b.data("precompiled");f||(f=b.text()||"",f=E.template(n,"{{ko_with $item.koBindingContext}}"+f+"{{/ko_with}}"),b.data("precompiled",f));b=[c.$data];c=E.extend({koBindingContext:c},e.templateOptions);c=E.tmpl(f,b,c);c.appendTo(x.createElement("div"));E.fragments={};return c};this.createJavaScriptEvaluatorBlock=function(a){return"{{ko_code ((function() { return "+a+" })()) }}"};this.addTemplate=function(a,b){x.write("<script type='text/html' id='"+a+"'>"+b+"<\/script>")};0<a&&(E.tmpl.tag.ko_code= +{open:"__.push($1 || '');"},E.tmpl.tag.ko_with={open:"with($1) {",close:"} "})};b.pa.prototype=new b.v;v=new b.pa;0<v.Cb&&b.va(v);b.b("jqueryTmplTemplateEngine",b.pa)}"function"===typeof require&&"object"===typeof exports&&"object"===typeof module?K(module.exports||exports):"function"===typeof define&&define.amd?define(["exports"],K):K(w.ko={});l; +})(); diff -r b36ce30f6577e2b1e5bea698845285e8be3b1856 -r 48e31ed50bba14b37ecfbbb9852b378fd521bd67 vcweb/lighterprints/templates/lighterprints/mobile/app/knockout.mapping-latest.js --- /dev/null +++ b/vcweb/lighterprints/templates/lighterprints/mobile/app/knockout.mapping-latest.js @@ -0,0 +1,21 @@ +/// Knockout Mapping plugin v2.3.5 +/// (c) 2012 Steven Sanderson, Roy Jacobs - http://knockoutjs.com/ +/// License: MIT (http://www.opensource.org/licenses/mit-license.php) +(function(e){"function"===typeof require&&"object"===typeof exports&&"object"===typeof module?e(require("knockout"),exports):"function"===typeof define&&define.amd?define(["knockout","exports"],e):e(ko,ko.mapping={})})(function(e,f){function x(b,c){var a,d;for(d in c)if(c.hasOwnProperty(d)&&c[d])if(a=f.getType(b[d]),d&&b[d]&&"array"!==a&&"string"!==a)x(b[d],c[d]);else if("array"===f.getType(b[d])&&"array"===f.getType(c[d])){a=b;for(var e=d,k=b[d],m=c[d],s={},g=k.length-1;0<=g;--g)s[k[g]]=k[g];for(g= +m.length-1;0<=g;--g)s[m[g]]=m[g];k=[];m=void 0;for(m in s)k.push(s[m]);a[e]=k}else b[d]=c[d]}function D(b,c){var a={};x(a,b);x(a,c);return a}function y(b,c){for(var a=D({},b),e=K.length-1;0<=e;e--){var f=K[e];a[f]&&(a[""]instanceof Object||(a[""]={}),a[""][f]=a[f],delete a[f])}c&&(a.ignore=h(c.ignore,a.ignore),a.include=h(c.include,a.include),a.copy=h(c.copy,a.copy),a.observe=h(c.observe,a.observe));a.ignore=h(a.ignore,i.ignore);a.include=h(a.include,i.include);a.copy=h(a.copy,i.copy);a.observe=h(a.observe, +i.observe);a.mappedProperties=a.mappedProperties||{};a.copiedProperties=a.copiedProperties||{};return a}function h(b,c){"array"!==f.getType(b)&&(b="undefined"===f.getType(b)?[]:[b]);"array"!==f.getType(c)&&(c="undefined"===f.getType(c)?[]:[c]);return e.utils.arrayGetDistinctValues(b.concat(c))}function E(b,c,a,d,j,k,m){var s="array"===f.getType(e.utils.unwrapObservable(c)),k=k||"";if(f.isMapped(b))var g=e.utils.unwrapObservable(b)[n],a=D(g,a);var i=m||j,h=function(){return a[d]&&a[d].create instanceof +Function},w=function(b){var f=F,g=e.dependentObservable;e.dependentObservable=function(a,b,c){c=c||{};a&&"object"==typeof a&&(c=a);var d=c.deferEvaluation,L=!1;c.deferEvaluation=!0;a=new G(a,b,c);if(!d){var g=a,d=e.dependentObservable;e.dependentObservable=G;a=e.isWriteableObservable(g);e.dependentObservable=d;a=G({read:function(){L||(e.utils.arrayRemoveItem(f,g),L=!0);return g.apply(g,arguments)},write:a&&function(a){return g(a)},deferEvaluation:!0});f.push(a)}return a};e.dependentObservable.fn= +G.fn;e.computed=e.dependentObservable;b=e.utils.unwrapObservable(j)instanceof Array?a[d].create({data:b||c,parent:i,skip:M}):a[d].create({data:b||c,parent:i});e.dependentObservable=g;e.computed=e.dependentObservable;return b},t=function(){return a[d]&&a[d].update instanceof Function},u=function(b,f){var g={data:f||c,parent:i,target:e.utils.unwrapObservable(b)};e.isWriteableObservable(b)&&(g.observable=b);return a[d].update(g)};if(m=H.get(c))return m;d=d||"";if(s){var s=[],r=!1,l=function(a){return a}; +a[d]&&a[d].key&&(l=a[d].key,r=!0);e.isObservable(b)||(b=e.observableArray([]),b.mappedRemove=function(a){var c="function"==typeof a?a:function(b){return b===l(a)};return b.remove(function(a){return c(l(a))})},b.mappedRemoveAll=function(a){var c=B(a,l);return b.remove(function(a){return-1!=e.utils.arrayIndexOf(c,l(a))})},b.mappedDestroy=function(a){var c="function"==typeof a?a:function(b){return b===l(a)};return b.destroy(function(a){return c(l(a))})},b.mappedDestroyAll=function(a){var c=B(a,l);return b.destroy(function(a){return-1!= +e.utils.arrayIndexOf(c,l(a))})},b.mappedIndexOf=function(a){var c=B(b(),l),a=l(a);return e.utils.arrayIndexOf(c,a)},b.mappedCreate=function(a){if(-1!==b.mappedIndexOf(a))throw Error("There already is an object with the key that you specified.");var c=h()?w(a):a;t()&&(a=u(c,a),e.isWriteableObservable(c)?c(a):c=a);b.push(c);return c});m=B(e.utils.unwrapObservable(b),l).sort();g=B(c,l);r&&g.sort();var r=e.utils.compareArrays(m,g),m={},I,z=e.utils.unwrapObservable(c),x={},y=!0,g=0;for(I=z.length;g<I;g++){var q= +l(z[g]);if(void 0===q||q instanceof Object){y=!1;break}x[q]=z[g]}var z=[],A=0,g=0;for(I=r.length;g<I;g++){var q=r[g],p,v=k+"["+g+"]";switch(q.status){case "added":var C=y?x[q.value]:J(e.utils.unwrapObservable(c),q.value,l);p=E(void 0,C,a,d,b,v,j);h()||(p=e.utils.unwrapObservable(p));v=N(e.utils.unwrapObservable(c),C,m);p===M?A++:z[v-A]=p;m[v]=!0;break;case "retained":C=y?x[q.value]:J(e.utils.unwrapObservable(c),q.value,l);p=J(b,q.value,l);E(p,C,a,d,b,v,j);v=N(e.utils.unwrapObservable(c),C,m);z[v]= +p;m[v]=!0;break;case "deleted":p=J(b,q.value,l)}s.push({event:q.status,item:p})}b(z);a[d]&&a[d].arrayChanged&&e.utils.arrayForEach(s,function(b){a[d].arrayChanged(b.event,b.item)})}else if(O(c)){b=e.utils.unwrapObservable(b);if(!b){if(h())return r=w(),t()&&(r=u(r)),r;if(t())return u(r);b={}}t()&&(b=u(b));H.save(c,b);if(t())return b;P(c,function(d){var f=k.length?k+"."+d:d;if(-1==e.utils.arrayIndexOf(a.ignore,f))if(-1!=e.utils.arrayIndexOf(a.copy,f))b[d]=c[d];else if("object"!=typeof c[d]&&"array"!= +typeof c[d]&&0<a.observe.length&&-1==e.utils.arrayIndexOf(a.observe,f))b[d]=c[d],a.copiedProperties[f]=!0;else{var g=H.get(c[d]),j=E(b[d],c[d],a,d,b,f,b),g=g||j;if(0<a.observe.length&&-1==e.utils.arrayIndexOf(a.observe,f))b[d]=g(),a.copiedProperties[f]=!0;else{if(e.isWriteableObservable(b[d]))b[d](e.utils.unwrapObservable(g));else g=void 0===b[d]?g:e.utils.unwrapObservable(g),b[d]=g;a.mappedProperties[f]=!0}}})}else switch(f.getType(c)){case "function":t()?e.isWriteableObservable(c)?(c(u(c)),b=c): +b=u(c):b=c;break;default:if(e.isWriteableObservable(b))return p=t()?u(b):e.utils.unwrapObservable(c),b(p),p;h()||t();b=h()?w():e.observable(e.utils.unwrapObservable(c));t()&&b(u(b))}return b}function N(b,c,a){for(var d=0,e=b.length;d<e;d++)if(!0!==a[d]&&b[d]===c)return d;return null}function Q(b,c){var a;c&&(a=c(b));"undefined"===f.getType(a)&&(a=b);return e.utils.unwrapObservable(a)}function J(b,c,a){for(var b=e.utils.unwrapObservable(b),d=0,f=b.length;d<f;d++){var k=b[d];if(Q(k,a)===c)return k}throw Error("When calling ko.update*, the key '"+ +c+"' was not found!");}function B(b,c){return e.utils.arrayMap(e.utils.unwrapObservable(b),function(a){return c?Q(a,c):a})}function P(b,c){if("array"===f.getType(b))for(var a=0;a<b.length;a++)c(a);else for(a in b)c(a)}function O(b){var c=f.getType(b);return("object"===c||"array"===c)&&null!==b}function S(){var b=[],c=[];this.save=function(a,d){var f=e.utils.arrayIndexOf(b,a);0<=f?c[f]=d:(b.push(a),c.push(d))};this.get=function(a){a=e.utils.arrayIndexOf(b,a);return 0<=a?c[a]:void 0}}function R(){var b= +{},c=function(a){var c;try{c=a}catch(e){c="$$$"}a=b[c];void 0===a&&(a=new S,b[c]=a);return a};this.save=function(a,b){c(a).save(a,b)};this.get=function(a){return c(a).get(a)}}var n="__ko_mapping__",G=e.dependentObservable,A=0,F,H,K=["create","update","key","arrayChanged"],M={},w={include:["_destroy"],ignore:[],copy:[],observe:[]},i=w;f.isMapped=function(b){return(b=e.utils.unwrapObservable(b))&&b[n]};f.fromJS=function(b){if(0==arguments.length)throw Error("When calling ko.fromJS, pass the object you want to convert."); +window.setTimeout(function(){A=0},0);A++||(F=[],H=new R);var c,a;2==arguments.length&&(arguments[1][n]?a=arguments[1]:c=arguments[1]);3==arguments.length&&(c=arguments[1],a=arguments[2]);a&&(c=D(c,a[n]));c=y(c);var d=E(a,b,c);a&&(d=a);--A||window.setTimeout(function(){for(;F.length;){var a=F.pop();a&&a()}},0);d[n]=D(d[n],c);return d};f.fromJSON=function(b){var c=e.utils.parseJson(b);arguments[0]=c;return f.fromJS.apply(this,arguments)};f.updateFromJS=function(){throw Error("ko.mapping.updateFromJS, use ko.mapping.fromJS instead. Please note that the order of parameters is different!"); +};f.updateFromJSON=function(){throw Error("ko.mapping.updateFromJSON, use ko.mapping.fromJSON instead. Please note that the order of parameters is different!");};f.toJS=function(b,c){i||f.resetDefaultOptions();if(0==arguments.length)throw Error("When calling ko.mapping.toJS, pass the object you want to convert.");if("array"!==f.getType(i.ignore))throw Error("ko.mapping.defaultOptions().ignore should be an array.");if("array"!==f.getType(i.include))throw Error("ko.mapping.defaultOptions().include should be an array."); +if("array"!==f.getType(i.copy))throw Error("ko.mapping.defaultOptions().copy should be an array.");c=y(c,b[n]);return f.visitModel(b,function(a){return e.utils.unwrapObservable(a)},c)};f.toJSON=function(b,c){var a=f.toJS(b,c);return e.utils.stringifyJson(a)};f.defaultOptions=function(){if(0<arguments.length)i=arguments[0];else return i};f.resetDefaultOptions=function(){i={include:w.include.slice(0),ignore:w.ignore.slice(0),copy:w.copy.slice(0)}};f.getType=function(b){if(b&&"object"===typeof b){if(b.constructor== +(new Date).constructor)return"date";if("[object Array]"===Object.prototype.toString.call(b))return"array"}return typeof b};f.visitModel=function(b,c,a){a=a||{};a.visitedObjects=a.visitedObjects||new R;var d,j=e.utils.unwrapObservable(b);if(O(j))a=y(a,j[n]),c(b,a.parentName),d="array"===f.getType(j)?[]:{};else return c(b,a.parentName);a.visitedObjects.save(b,d);var k=a.parentName;P(j,function(b){if(!(a.ignore&&-1!=e.utils.arrayIndexOf(a.ignore,b))){var i=j[b],g=a,h=k||"";"array"===f.getType(j)?k&& +(h+="["+b+"]"):(k&&(h+="."),h+=b);g.parentName=h;if(!(-1===e.utils.arrayIndexOf(a.copy,b)&&-1===e.utils.arrayIndexOf(a.include,b)&&j[n]&&j[n].mappedProperties&&!j[n].mappedProperties[b]&&j[n].copiedProperties&&!j[n].copiedProperties[b]&&"array"!==f.getType(j)))switch(f.getType(e.utils.unwrapObservable(i))){case "object":case "array":case "undefined":g=a.visitedObjects.get(i);d[b]="undefined"!==f.getType(g)?g:f.visitModel(i,c,a);break;default:d[b]=c(i,a.parentName)}}});return d}}); diff -r b36ce30f6577e2b1e5bea698845285e8be3b1856 -r 48e31ed50bba14b37ecfbbb9852b378fd521bd67 vcweb/lighterprints/templates/lighterprints/mobile/app/mobile.css --- /dev/null +++ b/vcweb/lighterprints/templates/lighterprints/mobile/app/mobile.css @@ -0,0 +1,38 @@ +body{ + text-align: left; +} +.navbar{ + padding-left: 20px; + padding-top: 10px; + padding-bottom: 10px; + display: block; + + font-size:25px; + font-weight:normal; +} + +.footerbar{ + padding-left: 20px; + padding-top: 10px; + padding-bottom: 10px; + display: block; + text-align:center; + font-size:25px; + font-weight:normal; +} +.innerblock{ + padding-left: 10px; + padding-right: 10px; + display: block; +} +.innerleft{ + text-align:left; + padding-left: 10px; + padding-right: 10px; + padding-top: 10px; + padding-bottom: 10px; + display: block; +} +.innerbutton{ + text-align:left; +} \ No newline at end of file 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. |
From: <com...@bi...> - 2013-05-01 20:08:29
|
1 new commit in vcweb: https://bitbucket.org/virtualcommons/vcweb/commits/b36ce30f6577/ Changeset: b36ce30f6577 User: rsinha Date: 2013-05-01 22:06:33 Summary: lighterprints mobile Affected #: 1 file diff -r 25fba99b9ba416b3f0ac302e479bff3b9f0d3d6e -r b36ce30f6577e2b1e5bea698845285e8be3b1856 vcweb/lighterprints/templates/lighterprints/mobile/index.html --- a/vcweb/lighterprints/templates/lighterprints/mobile/index.html +++ b/vcweb/lighterprints/templates/lighterprints/mobile/index.html @@ -1,336 +1,543 @@ -{% extends "mobile/base.html" %} -{% block title %}Lighter Footprints{% endblock %} -{% block head %} -{{ block.super }} -<style> -.center-wrapper { - width: 75%; - margin-left: auto; - margin-right: auto; -} - -.center-button { - text-align: center; - width: 100%; - margin: 0 auto; - margin-left: auto; - margin-right: auto; - align: center; - text-align: center; -} -img.displayed { - display: block; - margin-left: auto; - margin-right: auto -} -#homeicon .ui-icon-custom { - background-image: url("/lighterfootprints/resources/images/53-house.png"); - background-size: 18px 18px; -} - -#groupicon .ui-icon-custom { - background-image: url("/lighterfootprints/resources/images/112-group.png"); - background-size: 18px 18px; -} - -#notepadicon .ui-icon-custom { - background-image: url("/lighterfootprints/resources/images/179-notepad.png"); - background-size: 18px 18px; -} - -img { - float: left; -} -</style> -{% endblock %} -{% block page %} - <!-- Start of first page: #loginPage --> - <div data-role="page" id="loginPage"> - - <div data-role="header" data-theme="b"> - <h1>Lighter Footprints</h1> - </div><!-- /header --> - - <div data-role="content" data-theme="d" > - <form id="loginForm" class="ui-body ui-body-b ui-corner-all"> - <div data-role="fieldcontain"> - <label for="email">Email:</label> - <input type="email" name="email" id="email" value="" placeholder="Email" /> - <label for="password">Password:</label> - <input type="password" name="password" id="password" value="" placeholder="Password" /> - </div> - <button id="submitLogin" type="submit" class="center-button" > - Submit - </button> - </form> - - </div><!-- /content --> - - </div><!-- /page loginPage--> - - <!-- Start of second page: #homePage --> - <div data-role="page" id="homePage" > - <div class ="myHeader" data-role="header" data-theme="c" data-position="fixed"> - <br> - <div data-type="horizontal" class="center-button"> - <a href="#homePage" class="ui-btn-active ui-state-persist" data-role="button" data-icon="custom" id="homeicon" value="Home">Home</a><a href="#groupPage" data-role="button" id="groupicon" data-icon="custom" value="Group">Group</a><a href="#activitiesPage" data-role="button" data-icon="custom" id="notepadicon" value="Activities">Activities</a> - </div><!--control group --> - <br> - </div><!-- /header --> - - <div data-role="content" data-theme="d" data-inset="true" > - <div data-role="navbar" data-theme="b"> - <ul> - <li> - <a href="#" class="ui-btn-active ui-state-persist" data-role="button" data-theme="d">Current</a> - </li> - <li> - <a href="#scorePage" data-role="button" data-theme="d">Score</a> - </li> - </ul> - </div><!-- /navbar --> - <div id="homePageNoActFlag" data-bind="ifnot: hasAvailableActivities()"> - <b>No more activities available!</b><img src="/lighterfootprints/resources/images/warning.png" style="float:left;"></img> - </div> - <div id="homePageActivityList" data-bind="foreach: availableActivities" style="margin-top: 0;" - data-inset="true"> - <div data-role="button" data-theme ="d" data-bind="click: $parent.showActivityDetail"> - <img data-bind="attr:{src: icon_url}"></img> - <div data-bind="text: display_name"></div> - <div data-bind="if: time_slots"> - <a data-bind="text: time_slots"></a> - </div> - </div> - </div> - - </div><!-- /content --> - - <div data-role="footer" id="myFooter" style="text-align:center" data-theme="d" data-position="fixed"> - <a href="index.html" rel="external" data-theme="b" data-role="button">logout</a> - </div><!-- /footer --> - - </div><!-- /page homePage--> - - <!-- Start of third page: #activityDetailsPage --> - <div data-role="page" id="activityDetailsPage"> - <div class ="myHeader" data-role="header" data-theme="c" data-position="fixed"> - <br> - <div data-type="horizontal" class="center-button"> - <a href="#homePage" class="ui-btn-active ui-state-persist" data-role="button" data-icon="custom" id="homeicon" value="Home">Home</a><a href="#groupPage" data-role="button" id="groupicon" data-icon="custom" value="Group">Group</a><a href="#activitiesPage" data-role="button" data-icon="custom" id="notepadicon" value="Activities">Activities</a> - </div><!--control group --> - <br> - </div><!-- /header --> - - <div data-role="content" data-theme="d"> - <ul id="currActivityInfoList" data-bind="with: currentActivity" data-role="listview" data-content-theme="d" data-inset="true"> - <li data-role="list-divider" data-bind="text: display_name" data-theme="b" style="text-align: center"></li> - <img class="displayed" data-bind="attr:{src: icon_url}" style="float:none;"></img> - <li data-bind="if: summary" data-theme="c"> - Benefits to the Environment: <h4 data-bind="text: summary"></h4> - <li data-role="list-divider"></li> - </li> - <li data-bind="if: personal_benefits"> - Benefits to You: <h4 data-bind="text: personal_benefits"></h4> - <li data-role="list-divider"></li> - </li> - <li data-bind="if: time_slots"> - Availability: <h4 data-bind="text: time_slots" ></h4> - <li data-role="list-divider"></li> - </li> - <li data-bind="if: points"> - Green Points: <h4 data-bind="text: points"></h4> - <li data-role="list-divider"></li> - </li> - <li data-bind="if: available_now" data-theme="b"> - <a href data-inline="true" class="center" data-bind="click: $parent.done"> - Activity Performed! - </a> - </li> - </ul> - - <div data-role="collapsible" data-theme="b"> - <h4>Activity Details</h4> - <ul id="currActivityDetailsList" data-bind="with: currentActivity" - data-role="listview" data-inset="true"> - <li data-bind="if: description"> - Description: - <li data-bind="text: description"></li> - <li data-role="list-divider"></li> - </li> - <li data-bind="if: url"> - Source url: - <li data-bind="text: url"></li> - <li data-role="list-divider"></li> - </li> - </ul> - </div> - - </div><!-- /content --> - - <div data-role="footer" id="myFooter" data-theme="d" style="text-align:center" data-position="fixed"> - <a href="index.html" rel="external" data-role="button" data-theme="b">logout</a> - </div><!-- /footer --> - - </div><!-- /page activityDetailsPage--> - - <!-- Start of fourth page: #groupPage --> - <div data-role="page" id="groupPage"> - <div class ="myHeader" data-role="header" data-theme="c" data-position="fixed"> - <br> - <div data-type="horizontal" class="center-button"> - <a href="#homePage" data-role="button" data-icon="custom" id="homeicon" value="Home">Home</a><a href="#groupPage" class="ui-btn-active ui-state-persist" data-role="button" id="groupicon" data-icon="custom" value="Group">Group</a><a href="#activitiesPage" data-role="button" data-icon="custom" id="notepadicon" value="Activities">Activities</a> - </div><!--control group --> - <br> - </div><!-- /header --> - - <div data-role="content" data-theme="d" data-inset="true" > - <div data-role="navbar" data-theme="b"> - <ul> - <li> - <a href="#" class="ui-btn-active ui-state-persist" data-role="button" data-theme="d">Activites</a> - </li> - <li> - <a href="#messagePage" data-role="button" data-theme="d" >Messages</a> - </li> - </ul> - </div><!-- /navbar --> - - <ul id = "groupActivityList" data-bind="foreach: groupActivity" data-role="listview" data-theme="d" style="margin-top: 0;" data-inset="true"> - <li><img data-bind="attr:{src: icon_url}"></img> - <b data-bind="text: participant_name" ></b> completed <b data-bind="text: display_name" ></b> earning <b data-bind="text: points" ></b> Green Points - </li> - <li data-role="list-divider" data-theme="d"></li> - </ul> - - </div><!-- /content --> - - <div data-role="footer" id="myFooter" style="text-align:center" data-theme="d" data-position="fixed"> - <a href="index.html" rel="external" data-theme="b" data-role="button">logout</a> - </div><!-- /footer --> - - </div><!-- /page groupPagePage--> - - <!-- Start of fifth page: #scorePage --> - <div data-role="page" id="scorePage"> - <div class ="myHeader" data-role="header" data-theme="c" data-position="fixed"> - <br> - <div data-type="horizontal" class="center-button"> - <a href="#homePage" class="ui-btn-active ui-state-persist" data-role="button" data-icon="custom" id="homeicon" value="Home">Home</a><a href="#groupPage" data-role="button" id="groupicon" data-icon="custom" value="Group">Group</a><a href="#activitiesPage" data-role="button" data-icon="custom" id="notepadicon" value="Activities">Activities</a> - </div><!--control group --> - <br> - </div><!-- /header --> - - <div data-role="content" data-theme="d"> - <div data-role="navbar" data-theme="b"> - <ul> - <li> - <a href="#homePage" data-role="button" data-theme="d">Current</a> - </li> - <li> - <a href="#" class="ui-btn-active ui-state-persist" data-role="button" data-theme="d">Score</a> - </li> - </ul> - </div><!-- /navbar --> - <div id="scoreChart" style="margin-top: 0;" data-inset="true"></div> - </div> - - <div data-role="footer" id="myFooter" style="text-align:center" data-theme="d" data-position="fixed"> - <a href="index.html" rel="external" data-theme="b" data-role="button">logout</a> - </div><!-- /footer --> - - </div><!-- /scorePage--> - - <!-- Start of sixth page: #activitiesPage --> - <div data-role="page" id="activitiesPage" > - <div class ="myHeader" data-role="header" data-theme="c" data-position="fixed"> - <br> - <div data-type="horizontal" class="center-button"> - <a href="#homePage" data-role="button" data-icon="custom" id="homeicon" value="Home">Home</a><a href="#groupPage" data-role="button" id="groupicon" data-icon="custom" value="Group">Group</a><a href="#activitiesPage" class="ui-btn-active ui-state-persist" data-role="button" data-icon="custom" id="notepadicon" value="Activities">Activities</a> - </div><!--control group --> - <br> - </div><!-- /header --> - - <div data-role="content" data-theme="d" data-inset="true" > - <div data-bind='foreach: activitiesByLevel'> - <h4>Level <span data-bind='text: $index() + 1'></span> Activities</h4> - <div data-bind='template: { name: "activities-by-level-template", data: { activities: $data } }' style="margin-top: 0;" data-inset="true"> +<!DOCTYPE html> +<html> + <head> + <title>Lighter Footprints</title> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <link rel="stylesheet" href="themes/LFPTheme1.min.css" /> + <link rel="stylesheet" href="http://code.jquery.com/mobile/1.2.0/jquery.mobile.structure-1.2.0.min.css" /> + <link rel="stylesheet" href="font-awesome/jqm-icon-pack-3.0.0-fa.css"/> + <link rel="stylesheet" href="lighterfootprints-icon-kit/style.css" /> + <link rel="stylesheet" href="app/mobile.css"/> + <script src="http://code.jquery.com/jquery-1.8.2.min.js"> + </script> + <script src="http://code.jquery.com/mobile/1.2.0/jquery.mobile-1.2.0.min.js"> + </script> + <!-- KnockoutJS for MVVM--> + <script src="app/knockout-2.2.0.js"></script> + <script src="app/knockout.mapping-latest.js"></script> + <!--Local JS--> + <script src="app/controller.js"> + </script> + <!-- knockout templates --> + <script type='text/html' id='likeCommentTemplate'> + <div data-bind='if: $root.participantGroupId() != participant_group_id()'> + <span data-bind='ifnot: commented'><a class='comment comment-popover' href='javascript:void(0)' rel="popover" data-placement='left' data-title="Leave a comment" data-bind='popover: { content: "#commentPopoverForm", id: pk()}'><span class='comment lighterprints-gray icon-comment'></span></a></span> + <span data-bind='if: commented'><span class='commented icon-comment'></span></span> + <span data-bind='ifnot: liked'><a href='#' data-bind='click: $root.like'><span class='like lighterprints-gray icon-heart'></span></a></span> + <span data-bind='if: liked'><span class='liked icon-heart'></span></span> + </div> + </script> + <!-- group activity templates, keyed by parameter name --> + <script type='text/html' id='comment'> + <tr data-bind='if: $root.participantGroupId() != participant_group_id()'> + <td class='group-activity-icon'> + <span class='icon-comment lighterprints-blue'></span> + </td> + <td class='group-activity'> + Participant <strong data-bind='text: participant_number'></strong> + <small class='pull-right muted'> + <span data-bind='text: date_created'></span> + </small> + <div> + <span data-bind='if: target_parameter_name() === "activity_performed"'>commented on your completed challenge, <em data-bind='text: target_data_value'></em></span> + <span data-bind='if: target_parameter_name() === "chat_message" || target_parameter_name() === "comment"'>replied to your message, "<em data-bind='text: target_data_value'></em>"</span> + <div> + <small> + <span class='icon-quote-left'></span> + </small> + <span data-bind='text:value'></span> + <small> + <span class='icon-quote-right'></span> + </small> + </div> + </div> + <div data-bind='template: "likeCommentTemplate"'> + </div> + </td> + </tr> + </script> + <script type='text/html' id='like'> + <tr data-bind='if: $root.participantGroupId() != participant_group_id()'> + <td class='group-activity-icon'> + <span class='icon-heart lighterprints-red'></span> + </td> + <td class='group-activity'> + Participant <strong data-bind='text: participant_number'></strong> + <small class='pull-right muted'> + <span data-bind='text: date_created'></span> + </small> + <div> + liked your<span data-bind='if: target_parameter_name() === "activity_performed"'>completed challenge, <em data-bind='text: target_data_value'></em></span> + <span data-bind='if: target_parameter_name() === "chat_message" || target_parameter_name() === "comment"'>message, "<em data-bind='text: target_data_value'></em>"</span> + </div> + </td> + </tr> + </script> + <script type='text/html' id='chat_message'> + <tr> + <td class='group-activity-icon'> + <span class='icon-comment lighterprints-blue'></span> + </td> + <td class='group-activity'> + <strong>Participant <span data-bind='text: participant_number'></span></strong> + <small class='pull-right muted'> + <span data-bind='text: date_created'></span> + </small> + <div> + <small> + <span class='icon-quote-left'></span> + </small> + <span data-bind='text:value'></span> + <small> + <span class='icon-quote-right'></span> + </small> + </div> + <div data-bind="template: 'likeCommentTemplate'"> + </div> + </td> + </tr> + </script> + <script type='text/html' id='activity_performed'> + <tr> + <td class='group-activity-icon'> + <span class='icon-star text-gold'></span> + </td> + <td class='group-activity'> + <strong>Participant <span data-bind='text: participant_number'></span></strong> + <small class='pull-right muted'> + <span data-bind='text: date_created'></span> + </small> + <div> + earned <span class='lighterprints-green' data-bind='text:points'></span> + <span class='icon-leaf lighterprints-green'></span> + for <span data-bind='text: $root.groupName'></span> + by completing <em><span data-bind='text: display_name'></span></em>. + </div> + <div data-bind="template: 'likeCommentTemplate'"> + </div> + </td> + </tr> + </script> + <script type='text/html' id='challenges-template'> + <ul data-role="listview" data-inset="true" data-theme="d" data-bind='foreach: challenges'> + <li> + <div class='row challenge-row'> + <div class='span2'> + <img style='padding: 10px 0 0 20px;' data-bind='attr: {src: "https://vcweb.asu.edu/static/images/lighterprints/badges/" + name() + ".png" }'> + </div> + <div class='span4'> + <h4 class='challenge-name' data-bind='css: status, text:display_name'></h4> + <p> + <span data-bind='css: status, text: summary'></span> + </p> + <form data-bind='attr: { id: "challengeForm" + pk() }' class='form-horizontal' method='post'> + <input data-bind='value: pk' type='hidden' name='activity_id' /><input type='hidden' name='participant_group_id' value='1005' /> + <a href="#" data-role="button" data-inline="true" data-bind='css: status, click: $root.perform'> + <span data-bind='if: availableNow'>Perform</span> + <span data-bind='if: completed'>Completed <span class='icon-check'></span></span> + <span data-bind='if: expired'>Expired <span class='icon-warning-sign'></span></span> + <span data-bind='if: upcoming'>Not yet available <span class='icon-time'></span> + </span><span data-bind='if: locked'>Locked <span class='icon-lock'></span></span></a> + </form> + </div> + <div style='margin-top: 10px; padding: 15px 0;' class='span2'> + <table> + <tr> + <td class='lighterprints-scoreboard-xlarge'> + <span data-bind='text: points'></span> + </td> + <td> + <span class='lighterprints-green icon-leaf icon-2x'></span> + </td> + </tr> + </table> + <div style='margin-top: 5px; padding: 5px 0;' data-bind='css: status'> + <span class='icon-time'></span> + <strong><span data-bind='text: time_slots'></span></strong> + </div> + </div> + </div> + </li> + </ul> + </script> + <script type='text/html' id='no-group-activity-template'> + Your group has not had any activity yet. You can <a href='#dashboard' data-bind='click:activateDashboardTab' data-toggle='tab'>perform challenges in your dashboard</a> + or post messages in the <a href='#group' data-bind='click:activateGroupTab'>the group wall</a> + . + </script> + </head> + <body> + <!-- Start of first page: #loginPage --> + <div data-role="page" id="loginPage"> + <div data-role="header" data-theme="a"> + <div class="navbar"> + <img width="40px" height="40px" src="https://vcweb.asu.edu/static/images/lighterprints/logo.png" alt="footprint logo"> + lighter<strong style="color:#b9ed2e;">footprints</strong> + </div> + </div> + <div data-role="content"> + <form id="loginForm" class="ui-body"> + <div data-role="fieldcontain"> + <label for="email"> + Email: + </label> + <input type="email" name="email" id="email" value="" placeholder="Email"> + <label for="password"> + Password: + </label> + <input type="password" name="password" id="password" value="" placeholder="Password"> + </div><a href="#" data-theme="c" data-role="button" id="submitLogin" type="submit" class="center-button"> + <span class="icon-user"></span>Login</a> + </form> + </div> + </div> + <!-- /page loginPage--><!-- Start of #dashboardPage --> + <div data-role="page" id="dashboardPage"> + <div data-role="header" data-theme="a"> + <div class="navbar"> + <img width="40px" height="40px" src="https://vcweb.asu.edu/static/images/lighterprints/logo.png" alt="footprint logo">lighter<strong style="color:#b9ed2e;">footprints</strong> + <a href="#popupMenu" style="float:right;" data-rel="popup" data-role="button" data-inline="true" data-icon="align-justify" data-iconpos="notext" data-theme="a"></a> + <div data-role="popup" id="popupMenu" data-theme="a"> + <ul data-role="listview" data-inset="true" data-theme="a"> + <li> + <a href="#navPage">Navigate</a> + </li> + <li> + <a href="index.html" rel="external" data-role="button">logout</a> + </li> + </ul></div></div> - </div><!-- /content --> - - <div data-role="footer" id="myFooter" style="text-align:center" data-theme="d" data-position="fixed"> - <a href="index.html" rel="external" data-theme="b" data-role="button">logout</a> - </div><!-- /footer --> - - </div><!-- /page activitiesPage--> - - <!-- Start of seventh page: #messagePage --> - <div data-role="page" id="messagePage"> - <div class ="myHeader" data-role="header" data-theme="c" data-position="fixed"> - <br> - <div data-type="horizontal" class="center-button"> - <a href="#homePage" data-role="button" data-icon="custom" id="homeicon" value="Home">Home</a><a href="#groupPage" class="ui-btn-active ui-state-persist" data-role="button" id="groupicon" data-icon="custom" value="Group">Group</a><a href="#activitiesPage" data-role="button" data-icon="custom" id="notepadicon" value="Activities">Activities</a> - </div><!--control group --> - <br> - </div><!-- /header --> - - <div data-role="content" data-theme="d" data-inset="true" > - <div data-role="navbar" data-theme="b"> - <ul> - <li> - <a href="#groupPage" data-role="button" data-theme="d">Activites</a> - </li> - <li> - <a href="#" class="ui-btn-active ui-state-persist" data-role="button" data-theme="d" >Messages</a> - </li> - </ul> - </div><!-- /navbar --> - - <ul id = "groupPageMessageList" data-bind="foreach: chatMessages" data-role="listview" data-theme="d" style="margin-top: 0;" data-inset="true"> - <li> - <b data-bind="text: participant_name"></b> : <b data-bind="text: message"></b> - <!--<img src="/lighterfootprints/resources/images/thumbs-up/thumbs-up-0.png" style="float:right;"></img> --> - </li> - <li data-role="list-divider" data-theme="d"></li> - </ul> - - <form id="chat-form"> - <div id="messageSend" data-role="fieldcontain" class="ui-body ui-corner-all"> - <label for="message"><b>Message :</b></label> - <input type="text" name="message" id="chatText" value="" placeholder="message" /> - <a data-theme="b" id="sendMessage" data-role="button" data-inline="true" data-bind="click:submitChatMessage">Send</a> - </div> - </form> - </div><!-- /content --> - - <div data-role="footer" id="myFooter" style="text-align:center" data-theme="d" data-position="fixed" > - <a href="index.html" rel="external" data-role="button" data-theme="b" >logout</a> - </div><!-- /footer --> - - </div><!-- /page groupPagePage--> - - {% block javascript %} - {{ block.super }} - <!--JQPlot--> - <script type="text/javascript" src="{{STATIC_URL}}js/jquery.jqplot.min.js"></script> - <link rel="stylesheet" type="text/css" href="{{STATIC_URL}}js/jquery.jqplot.min.css" /> - <script type="text/javascript" src="{{STATIC_URL}}js/jqplot.barRenderer.min.js"></script> - <script type="text/javascript" src="{{STATIC_URL}}js/jqplot.categoryAxisRenderer.min.js"></script> - <script type="text/javascript" src="{{STATIC_URL}}js/jqplot.pointLabels.min.js"></script> - <!--Local JS--> - <script src='{{STATIC_URL}}js/lighterprints/model.js'></script> - <script src='{{STATIC_URL}}js/lighterprints/mobile/controller.js'></script> - <script type='text/html' id='activities-by-level-template'> - <div data-bind='foreach: activities'> - <div data-role="button" data-theme ="d" data-bind="click: $root.showActivityDetail"> - <img data-bind="attr:{src: icon_url}"></img> - <div data-bind="text: display_name"></div> - <div data-bind="if: time_slots"> - <a data-bind="text: time_slots"></a> + </div> + <div data-role="content"> + <div class="ui-bar"> + <h2><span class="icon-gauge"></span>Team Dashboard</h2></div> + <div class="ui-grid-a" data-inset="true"> + <div class="ui-block-a"> + <div class="ui-bar ui-bar-d" style="height:120px"> + TODAY'S SCORE + <br> + <span data-bind="text: averagePoints"></span> + </div> + </div> + <div class="ui-block-b"> + <div class="ui-bar ui-bar-d" style="height:120px"> + CURRENT LEVEL + <div data-bind='if: experimentCompleted'> + <img alt='Experiment Completed' class='group-level' width='120' height='70' src='https://vcweb.asu.edu/static/images/lighterprints/experiment-completed.png'> + </div> + <div data-bind='ifnot: experimentCompleted'> + <img alt='Group Level' class='group-level' width="104" height="65" data-bind="attr: { src: 'https://vcweb.asu.edu/static/images/lighterprints/rank' + groupLevel() + '.png' }"> + </div> + </div> + </div> + </div><!-- /grid-a --> + <div class="ui-grid-a"> + <div class="ui-block-a"> + <div class="ui-bar ui-bar-d" style="height:120px"> + TODAY"S PROGRESS + <br> + Your group progress: <span data-bind="text: averagePoints"></span> + <span data-bind="text:pointsToNextLevel"></span> + </div> + </div> + <div class="ui-block-b"> + <div class="ui-bar ui-bar-d" style="height:120px"> + TIME REMAINING + <table> + <tr> + <td> + <span data-bind="text: hoursLeft"></span>h + </td> + <td> + <span data-bind="text: minutesLeft"></span>m + </td> + </tr> + </table> + </div> + </div> + </div> + <br> + <br> + <h2><span class="icon-star"></span>Challenges</h2> + <div class="ui-bar-d"> + <div data-role="navbar"> + <ul> + <li> + <a href="#" class="ui-btn-active"><span class="icon-star"></span>Unlocked</a> + </li> + <li> + <a href="#dashboardLockedChallengePage"><span class="icon-lock"></span>Locked</a> + </li> + </ul> + </div> + <div class='tab-pane active' id='unlocked-challenges'> + <div data-bind="template: { name: 'challenges-template', data: { challenges: unlockedChallenges() } }"> + </div> + </div> + </div> + <br> + <br> + <h2><span class="icon-trophy"></span>Leaderboard</h2> + <div class="ui-bar-d"> + <ul data-role="listview" data-bind="foreach: groupData" data-inset="true" data-theme="b"> + <li> + <strong>#<span data-bind="text:$index() + 1"></span></strong> + <span data-bind="text: groupName"></span> + <span class="ui-li-count" data-bind="text: totalPoints"></span> + </li> + </ul> + </div> + <br> + <br> + <h2><span class="icon-user"></span>Team Activity</h2> + <div class="ui-bar-d"> + <div data-bind='ifnot: hasGroupActivity()'> + <div data-bind='template: { name: "no-group-activity-template" }'> + </div> + </div> + <table class='table group-activity'> + <tbody data-bind='template: { name: groupActivityTemplate, foreach: groupActivity.slice(0, 6) }'> + </tbody> + </table></div></div> - </script> - {% endblock %} -{% endblock page %} - + <div data-role="footer" data-position="fixed" data-theme="c"> + <div class="ui-bar-b" style="text-align: center;padding-top: 10px;padding-bottom: 10px;"> + <div data-role="controlgroup" data-type="horizontal" data-theme="b"> + <a href="#" data-theme="b">Dashboard</a> + <a href="#">Challenges</a> + <a href="#">My Team</a> + <a href="#">Help</a> + </div> + 2013 Arizona Board Of Regents + </div> + <div class="footerbar"> + <img width="50px" height="50px" src="https://vcweb.asu.edu/static/images/lighterprints/logo.png" alt="footprint logo">lighter<strong>footprints</strong> + </div> + </div> + </div> + <!-- /page dashboardPage--><!-- /page loginPage--><!-- Start of #navPage --> + <div data-role="page" id="navPage" data-position="fixed"> + <div data-role="content"> + <div class="ui-bar-d"> + <a href="#dashboardPage" data-theme="c" data-role="button" class="innerbutton"><h2><span class="icon-gauge"></span>Dashboard</h2></a> + <a href="#challengesPage" data-theme="c" data-role="button" class="innerbutton"><h2><span class="icon-star"></span>Challenges</h2></a> + <a href="#myTeamPage" data-theme="c" data-role="button" class="innerbutton"><h2><span class="icon-user"></span>My Team</h2></a> + <a href="#helpPage" data-theme="c" data-role="button" class="innerbutton"><h2><span class="icon-question"></span>Help</h2></a> + <a href="#" data-theme="c" data-role="button" class="innerbutton"><h2><span class="icon-cog"></span>Settings</h2></a> + </div> + <br> + <br> + </div> + </div> + <!-- /page navPage--><!-- /page dashboardPage--><!-- Start of #dashboardLockedChallengePage --> + <div data-role="page" id="dashboardLockedChallengePage"> + <div data-role="content"> + <h2><span class="icon-star"></span>Challenges</h2> + <div class="ui-bar-d"> + <div data-role="navbar"> + <ul> + <li> + <a href="#dashboardPage"><span class="icon-star"></span>Unlocked</a> + </li> + <li> + <a href="#" class="ui-btn-active"><span class="icon-lock"></span>Locked</a> + </li> + </ul> + </div> + <!-- /navbar --> + <div class='tab-pane' id='locked-challenges'> + <div data-bind='if: lockedChallenges().length === 0'> + <div style='padding: 10px;' class='alert-block'> + <span class='text-gold icon-star'></span>Congratulations, your group has unlocked all of the challenges. + </div> + </div> + <div data-bind="template: { name: 'challenges-template', data: { challenges: lockedChallenges() } }"> + </div> + </div> + </div> + </div> + </div> + <!-- /page dashboardLockedChallengePage--><!-- Start of first page: #challengesPage --> + <div data-role="page" id="challengesPage"> + <div data-role="content"> + <h2><span class="icon-star"></span>Challenges</h2> + <div class="ui-bar-d"> + <div data-role="navbar"> + <ul> + <li> + <a href="#" class="ui-btn-active"><span class="icon-star"></span>Unlocked</a> + </li> + <li> + <a href="#lockedChallengePage"><span class="icon-lock"></span>Locked</a> + </li> + </ul> + </div> + <div class='tab-pane active' id='unlocked-challenges'> + <div data-bind="template: { name: 'challenges-template', data: { challenges: unlockedChallenges() } }"> + </div> + </div> + </div> + </div> + </div> + <!-- /page challengesPage--><!-- Start of #lockedChallengePage --> + <div data-role="page" id="lockedChallengePage"> + <div data-role="content"> + <h2><span class="icon-star"></span>Challenges</h2> + <div class="ui-bar-d"> + <div data-role="navbar"> + <ul> + <li> + <a href="#challengesPage"><span class="icon-star"></span>Unlocked</a> + </li> + <li> + <a href="#" class="ui-btn-active"><span class="icon-lock"></span>Locked</a> + </li> + </ul> + </div> + <!-- /navbar --> + <div class='tab-pane' id='locked-challenges'> + <div data-bind='if: lockedChallenges().length === 0'> + <div style='padding: 10px;' class='alert-block'> + <span class='text-gold icon-star'></span>Congratulations, your group has unlocked all of the challenges. + </div> + </div> + <div data-bind="template: { name: 'challenges-template', data: { challenges: lockedChallenges() } }"> + </div> + </div> + </div> + </div> + </div> + <!-- /page lockedChallengePage--><!-- Start of page: #myTeamPage --> + <div data-role="page" id="myTeamPage"> + <div data-role="content" id="myTeam"> + <h2><span class="icon-comment"></span>My Team</h2> + <div class="ui-bar-d"> + <div data-bind="ifnot: hasChatMessages() " data-inset="true"> + No chat messages have been posted yet. + </div> + <div data-bind="if: hasChatMessages()"> + <ul data-role="listview" data-bind="foreach: chatMessages" data-inset="true" style="overflow-y: scroll;"> + <li> + <i class='icon-user icon-2x'></i> + <span><strong>Participant <span data-bind="text: participant_number"></span></strong> + <br> + <span data-bind="text: value"></span> + <br> + <span data-bind="text: date_created"></span>ago + </span> + </li> + </ul> + </div> + <form id="chat-form"> + <div class="innerblock"> + <input type="hidden" name="participant_group_id" value="1005"><input type="text" id="chatText" name="message" placeholder="Send a message to your group"> + <fieldset> + <div> + <a href="#" data-role="button" id="submitChatMessage" type="submit">SEND</a> + </div> + </fieldset> + </div> + </form> + </div> + </div> + </div> + <!-- /page myTeamPage--><!-- Start of page: #modalPage --><!-- /page modalPage--><!-- Start of page: #helpPage --> + <div data-role="page" id="helpPage" data-close-btn="right"> + <div data-role="content"> + <h2><span class="icon-question"></span>Help</h2> + <div class="ui-bar-d" data-inset="true"> + <h2>Instructions</h2> + <p> + You have been randomly placed in a group of <strong>5 participants</strong>. + In this experiment you can perform virtual actions that represent green alternatives to some common daily + activities. Some of these activities are available all day, and others are only available at + specific times. You can learn more about them by clicking on the <a href="#challengesPage">Challenges tab</a> + and selecting an activity. + </p> + <h2>Challenges, Green Points, and Levels</h2> + <p> + Each <strong class="text-gold">challenge</strong> + is worth a certain number of <strong class="lighterprints-green">green points <span class="icon-leaf"></span></strong>. + For example, <em>Eat locally grown food for lunch</em> + (available from 12-2pm) is worth <span class="lighterprints-green">15 <span class="icon-leaf"></span></span> + green points. + In order to perform this challenge you must login to the application between 12pm and 2pm, + select the challenge from the list below, and click the "Perform" button. + </p> + <p> + Your group is currently <strong class="text-gold">Level <span data-bind="text:groupLevel"></span></strong> + and has an average score of <strong class="lighterprints-green"><span data-bind="text:averagePoints"></span><span class="icon-leaf"></span></strong>. In order to + advance in level and unlock more challenges the <em>average number of points contributed by each member of your group</em> + must be equal to or greater than <strong class="lighterprints-green"><span data-bind="text: pointsToNextLevel"></span><span class="icon-leaf"></span></strong>. + In order to reach this target you and a majority of the members of your group must perform + high point challenges when they are available. + </p> + <h2>How to participate</h2> + <p> + To participate, simply click on the <a href="#challengesPage">Challenges tab</a>, and select a challenge you"d like to perform. + You can leave messages for the other members n your group via the <a href="#myTeamPage">My Group tab</a> + or use the <a href="#dashboardPage">Dashboard</a> + to view your group"s progress. + <br> + You can also <a href="#dashboardPage">restart the tutorial</a>. + </p> + </div> + <div class="ui-bar-d"> + <h2>Frequently Asked Questions</h2> + <ul data-role="listview" data-inset="true" data-theme="b"> + <li> + <h2>I performed an activity worth 15 points but only 3 points were added to Today"s Progress and Today"s Score. Why?</h2> + <p> + The numbers in Today"s Score Today"s Progress represent your group"s <b>average number of earned green points</b>. If there are 5 + people in your group, performing a 15 point activity adds 3 points to the group average (15 / 5 = 3). + </p> + </li> + <li> + <h2>Why do the challenges performed in the previous day not count for today?</h2> + <p> + In order to advance in level and unlock more challenges you must reach an average level of points in your + group during one day, starting at 0.00AM. Every day at midnight the server will check your group"s average number of + points and determine whether or not you should move on to the next level. + If your group advances in level your group will once again start at 0 points with the additional unlocked + challenges for that level available to perform. If your group did not reach the next level, your group + will start with 0 points at the same level with the same challenges available as the previous day. + </p> + </li> + <li> + <h2>I don"t have a car or anyone to carpool with, so how can I carpool?</h2> + <p> + You don"t have to actually perform the activity in the real world to click on "perform". These are just + virtual challenges for the time being. In the future we plan to allow participants to gain points by + actually performing these challenges. + </p> + </li> + </ul> + </div> + </div> + </div> + <!-- /page helpPage--> + <div data-role="page" id="modalPage" data-close-btn="right"> + <div data-role="header"> + <h1></h1> + </div> + <div data-role="content"> + <div id='activityPerformedModalText' data-bind='with: lastPerformedActivity'> + <div class='row-fluid pagination-centered'> + <img alt='Lighterprints Activity Badge' data-bind='attr: {src: "https://vcweb.asu.edu/static/images/lighterprints/badges/" + name() + ".png" }'> + </div><h3>You completed a challenge!</h3> + <p> + <strong><em data-bind='text: display_name'></em></strong> + for <span class='lighterprints-green' data-bind='text: points'></span> + <i class='icon-leaf lighterprints-green'></i> + </p> + <p data-bind='text: summary'> + </p> + <a href="#" data-role="button" data-rel="back" data-theme="b">OK</a> + </div> + </div> + </div> + </body> +</html> 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. |
From: <com...@bi...> - 2013-05-01 09:27:01
|
1 new commit in vcweb: https://bitbucket.org/virtualcommons/vcweb/commits/25fba99b9ba4/ Changeset: 25fba99b9ba4 User: alllee Date: 2013-05-01 11:26:46 Summary: clearing current_repeated_round_sequence_number when advancing rounds Affected #: 2 files diff -r b1e17ca78df337f0b00809b29a61301f3a0d8e63 -r 25fba99b9ba416b3f0ac302e479bff3b9f0d3d6e vcweb/core/models.py --- a/vcweb/core/models.py +++ b/vcweb/core/models.py @@ -871,7 +871,9 @@ if self.should_repeat: self.current_repeated_round_sequence_number += 1 elif self.has_next_round: +# advance sequence number and blank out repeated round sequence number if necessary self.current_round_sequence_number += 1 + self.current_repeated_round_sequence_number = 0 else: logger.warning("trying to advance past the last round - no-op") return diff -r b1e17ca78df337f0b00809b29a61301f3a0d8e63 -r 25fba99b9ba416b3f0ac302e479bff3b9f0d3d6e vcweb/core/tests.py --- a/vcweb/core/tests.py +++ b/vcweb/core/tests.py @@ -333,10 +333,18 @@ csn = e.current_repeated_round_sequence_number rd0 = e.current_round_data self.assertEquals(csn, 0) + for i in range(1, 5): + e.advance_to_next_round() + self.assertEquals(e.current_round_sequence_number, sn) + logger.debug("current repeating round: %s", e.current_repeated_round_sequence_number) + self.assertEquals(e.current_repeated_round_sequence_number, i) + self.assertNotEqual(rd0, e.current_round_data) + ''' FIXME: doesn't currently work with round configuration setup e.advance_to_next_round() - self.assertEquals(e.current_round_sequence_number, sn) - self.assertEquals(e.current_repeated_round_sequence_number, 1) - self.assertNotEqual(rd0, e.current_round_data) + logger.debug("current repeating round: %s", e.current_repeated_round_sequence_number) + self.assertEquals(e.current_round_sequence_number, sn + 1) + self.assertEquals(e.current_repeated_round_sequence_number, 0) + ''' def test_parameterized_value(self): e = 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. |
From: <com...@bi...> - 2013-05-01 09:06:17
|
1 new commit in vcweb: https://bitbucket.org/virtualcommons/vcweb/commits/b1e17ca78df3/ Changeset: b1e17ca78df3 User: alllee Date: 2013-05-01 11:05:58 Summary: fixing bugs with repeating round Affected #: 2 files diff -r 29327847bf793e0a51ec70113f10f3862a624013 -r b1e17ca78df337f0b00809b29a61301f3a0d8e63 vcweb/core/models.py --- a/vcweb/core/models.py +++ b/vcweb/core/models.py @@ -512,7 +512,10 @@ def get_round_data(self, round_configuration=None): if round_configuration is None: round_configuration = self.current_round - return RoundData.objects.select_related('round_configuration').get(experiment=self, round_configuration=round_configuration) + ps = dict(round_configuration=round_configuration) + if round_configuration.is_repeating_round: + ps.update(repeating_round_sequence_number=self.current_repeated_round_sequence_number) + return RoundData.objects.select_related('round_configuration').get(experiment=self, **ps) @property def playable_round_data(self): @@ -880,7 +883,7 @@ ps = dict(round_configuration=round_configuration) if round_configuration.is_repeating_round: # create round data with repeating sequence number - ps['repeating_round_sequence_number'] = round_configuration.current_repeated_round_sequence_number + ps['repeating_round_sequence_number'] = self.current_repeated_round_sequence_number round_data, created = self.round_data_set.get_or_create(**ps) if self.experiment_configuration.is_experimenter_driven: # create participant ready data values for every round in experimenter driven experiments diff -r 29327847bf793e0a51ec70113f10f3862a624013 -r b1e17ca78df337f0b00809b29a61301f3a0d8e63 vcweb/core/tests.py --- a/vcweb/core/tests.py +++ b/vcweb/core/tests.py @@ -323,6 +323,21 @@ class RoundConfigurationTest(BaseVcwebTest): + def test_repeating_round(self): + self.advance_to_data_round() + e = self.experiment + current_round = e.current_round + current_round.repeat = 5 + current_round.save() + sn = e.current_round_sequence_number + csn = e.current_repeated_round_sequence_number + rd0 = e.current_round_data + self.assertEquals(csn, 0) + e.advance_to_next_round() + self.assertEquals(e.current_round_sequence_number, sn) + self.assertEquals(e.current_repeated_round_sequence_number, 1) + self.assertNotEqual(rd0, e.current_round_data) + def test_parameterized_value(self): e = self.experiment p = Parameter.objects.create(scope='round', name='test_round_parameter', type='int', creator=e.experimenter, experiment_metadata=e.experiment_metadata) 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. |
From: <com...@bi...> - 2013-04-30 08:41:23
|
1 new commit in vcweb: https://bitbucket.org/virtualcommons/vcweb/commits/29327847bf79/ Changeset: 29327847bf79 User: alllee Date: 2013-04-30 10:41:08 Summary: missing __init__ Affected #: 1 file 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. |
From: <com...@bi...> - 2013-04-30 00:16:22
|
1 new commit in vcweb: https://bitbucket.org/virtualcommons/vcweb/commits/29104e6b13f7/ Changeset: 29104e6b13f7 Branch: stable User: alllee Date: 2013-04-30 02:16:09 Summary: merging south cleanup back into stable along with enhancements for repeating rounds Affected #: 17 files diff -r 971eb6e04082f34076f61841698e2d5948088421 -r 29104e6b13f704aa1a7c9ca0278b42e57d173be7 fabfile.py --- a/fabfile.py +++ b/fabfile.py @@ -25,9 +25,10 @@ env.hosts = ['localhost'] env.hg_url = 'https://bitbucket.org/virtualcommons/vcweb' env.apache = 'httpd' -env.applist = ['core', 'forestry', 'boundaries', 'lighterprints'] +env.applist = ['core', 'forestry', 'bound', 'lighterprints', 'broker'] env.docs_path = os.path.join(env.project_path, 'docs') env.remote_docs_path = '/home/csid/public_html/api/vcweb' +env.testdata_fixtures = 'forestry_experiment_metadata lighterprints_experiment_metadata activities bound_experiment_metadata bound_parameters' env.apps = ' '.join(env.applist) # django integration for access to settings, etc. @@ -54,7 +55,7 @@ def testdata(): syncdb() with cd(env.project_path): - _virtualenv(local, '%(python)s manage.py loaddata forestry_experiment_metadata lighterprints_experiment_metadata bound_experiment_metadata bound_parameters' % env) + _virtualenv(local, '%(python)s manage.py loaddata %(testdata_fixtures)s' % env) def migrate(): diff -r 971eb6e04082f34076f61841698e2d5948088421 -r 29104e6b13f704aa1a7c9ca0278b42e57d173be7 vcweb/bound/fixtures/bound_parameters.json --- a/vcweb/bound/fixtures/bound_parameters.json +++ b/vcweb/bound/fixtures/bound_parameters.json @@ -1,52 +1,60 @@ [ { "fields": { - "name":"player_status", - "experiment_metadata": 1, - "creator": 1, - "type": "int", - "date_created": "2011-01-01 15:13:03", - "last_modified": "2011-01-01 15:13:05", - "scope": "participant" + "name":"player_status", + "creator": 1, + "type": "boolean", + "date_created": "2011-01-01 15:13:03", + "last_modified": "2011-01-01 15:13:05", + "scope": "participant" }, "model": "core.parameter", "pk": 1111 }, { "fields": { - "name":"cost_of_living", - "experiment_metadata": 1, - "creator": 1, - "type": "float", - "date_created": "2011-01-01 15:13:03", - "last_modified": "2011-01-01 15:13:05", - "scope": "round" + "name":"cost_of_living", + "creator": 1, + "type": "int", + "date_created": "2011-01-01 15:13:03", + "last_modified": "2011-01-01 15:13:05", + "scope": "round" }, "model": "core.parameter", "pk": 1113 }, { "fields": { - "name":"shared_resource", - "experiment_metadata": 1, - "creator": 1, - "type": "boolean", - "date_created": "2011-01-01 15:13:03", - "last_modified": "2011-01-01 15:13:05", - "scope": "round" + "name":"shared_resource", + "creator": 1, + "type": "boolean", + "date_created": "2011-01-01 15:13:03", + "last_modified": "2011-01-01 15:13:05", + "scope": "round" }, "model": "core.parameter", "pk": 1114 }, { "fields": { - "name":"storage", - "experiment_metadata": 1, - "creator": 1, - "type": "int", - "date_created": "2011-01-01 15:13:07", - "last_modified": "2011-01-01 15:15:05", - "scope": "participant" + "name":"max_harvest_decision", + "creator": 1, + "type": "int", + "date_created": "2011-01-01 15:13:03", + "last_modified": "2011-01-01 15:13:05", + "scope": "round" + }, + "model": "core.parameter", + "pk": 1116 + }, + { + "fields": { + "name":"storage", + "creator": 1, + "type": "int", + "date_created": "2011-01-01 15:13:07", + "last_modified": "2011-01-01 15:15:05", + "scope": "participant" }, "model": "core.parameter", "pk": 1115 diff -r 971eb6e04082f34076f61841698e2d5948088421 -r 29104e6b13f704aa1a7c9ca0278b42e57d173be7 vcweb/bound/migrations/0002_max_harvest_decision.py --- a/vcweb/bound/migrations/0002_max_harvest_decision.py +++ /dev/null @@ -1,405 +0,0 @@ -# -*- coding: utf-8 -*- -import datetime -from south.db import db -from south.v2 import DataMigration -from django.db import models - -class Migration(DataMigration): - - def forwards(self, orm): - "Write your forwards methods here." - # Note: Remember to use orm['appname.ModelName'] rather than "from appname.models..." - Parameter = orm['core.Parameter'] - Experimenter = orm['core.Experimenter'] - Parameter.objects.create(name='max_harvest_decision', - creator=Experimenter.objects.get(pk=1), - type='int', - scope='experiment', - default_value_string='10', - description='Maximum harvest decision a player can make in a typical harvesting experiment') - - - def backwards(self, orm): - "Write your backwards methods here." - - models = { - u'auth.group': { - 'Meta': {'object_name': 'Group'}, - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - u'auth.permission': { - 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - u'auth.user': { - 'Meta': {'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) - }, - u'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - }, - u'core.activitylog': { - 'Meta': {'object_name': 'ActivityLog'}, - 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'log_message': ('django.db.models.fields.TextField', [], {}) - }, - u'core.address': { - 'Meta': {'object_name': 'Address'}, - 'city': ('django.db.models.fields.CharField', [], {'max_length': '128', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'state': ('django.db.models.fields.CharField', [], {'max_length': '128', 'blank': 'True'}), - 'street1': ('django.db.models.fields.CharField', [], {'max_length': '256'}), - 'street2': ('django.db.models.fields.CharField', [], {'max_length': '256'}), - 'zipcode': ('django.db.models.fields.CharField', [], {'max_length': '8', 'blank': 'True'}) - }, - u'core.chatmessage': { - 'Meta': {'ordering': "['date_created']", 'object_name': 'ChatMessage', '_ormbases': [u'core.ParticipantRoundDataValue']}, - u'participantrounddatavalue_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['core.ParticipantRoundDataValue']", 'unique': 'True', 'primary_key': 'True'}), - 'target_participant': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'target_participant_chat_message_set'", 'null': 'True', 'to': u"orm['core.ParticipantGroupRelationship']"}) - }, - u'core.comment': { - 'Meta': {'ordering': "['date_created']", 'object_name': 'Comment', '_ormbases': [u'core.ParticipantRoundDataValue']}, - u'participantrounddatavalue_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['core.ParticipantRoundDataValue']", 'unique': 'True', 'primary_key': 'True'}) - }, - u'core.experiment': { - 'Meta': {'ordering': "['date_created', 'status']", 'object_name': 'Experiment'}, - 'amqp_exchange_name': ('django.db.models.fields.CharField', [], {'default': "'vcweb.default.exchange'", 'max_length': '64'}), - 'authentication_code': ('django.db.models.fields.CharField', [], {'default': "'vcweb.auth.code'", 'max_length': '32'}), - 'current_repeated_round_sequence_number': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), - 'current_round_elapsed_time': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), - 'current_round_sequence_number': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1'}), - 'current_round_start_time': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), - 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'duration': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}), - 'experiment_configuration': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.ExperimentConfiguration']"}), - 'experiment_metadata': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.ExperimentMetadata']"}), - 'experimenter': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Experimenter']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'last_modified': ('vcweb.core.models.AutoDateTimeField', [], {'default': 'datetime.datetime.now'}), - 'start_date_time': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), - 'status': ('django.db.models.fields.CharField', [], {'default': "'INACTIVE'", 'max_length': '32'}), - 'tick_duration': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}), - 'total_elapsed_time': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}) - }, - u'core.experimentactivitylog': { - 'Meta': {'object_name': 'ExperimentActivityLog', '_ormbases': [u'core.ActivityLog']}, - u'activitylog_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['core.ActivityLog']", 'unique': 'True', 'primary_key': 'True'}), - 'experiment': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_log_set'", 'to': u"orm['core.Experiment']"}), - 'round_configuration': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.RoundConfiguration']"}) - }, - u'core.experimentconfiguration': { - 'Meta': {'ordering': "['experiment_metadata', 'creator', 'date_created']", 'object_name': 'ExperimentConfiguration'}, - 'creator': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'experiment_configuration_set'", 'to': u"orm['core.Experimenter']"}), - 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'exchange_rate': ('django.db.models.fields.DecimalField', [], {'default': '0.2', 'null': 'True', 'max_digits': '6', 'decimal_places': '2', 'blank': 'True'}), - 'experiment_metadata': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'experiment_configuration_set'", 'to': u"orm['core.ExperimentMetadata']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'invitation_subject': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - 'invitation_text': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - 'is_experimenter_driven': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_modified': ('vcweb.core.models.AutoDateTimeField', [], {'default': 'datetime.datetime.now'}), - 'max_group_size': ('django.db.models.fields.PositiveIntegerField', [], {'default': '5'}), - 'max_number_of_participants': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'treatment_id': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}) - }, - u'core.experimenter': { - 'Meta': {'ordering': "['user']", 'object_name': 'Experimenter'}, - 'approved': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'authentication_token': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'}), - 'failed_password_attempts': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'institution': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Institution']", 'null': 'True', 'blank': 'True'}), - 'user': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'experimenter'", 'unique': 'True', 'to': u"orm['auth.User']"}) - }, - u'core.experimenterrequest': { - 'Meta': {'object_name': 'ExperimenterRequest'}, - 'approved': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'user': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['auth.User']", 'unique': 'True'}) - }, - u'core.experimentmetadata': { - 'Meta': {'ordering': "['namespace', 'date_created']", 'object_name': 'ExperimentMetadata'}, - 'about_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), - 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'default_configuration': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.ExperimentConfiguration']", 'null': 'True', 'blank': 'True'}), - 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'last_modified': ('vcweb.core.models.AutoDateTimeField', [], {'default': 'datetime.datetime.now'}), - 'logo_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), - 'namespace': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), - 'short_name': ('django.db.models.fields.SlugField', [], {'max_length': '32', 'unique': 'True', 'null': 'True', 'blank': 'True'}), - 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}) - }, - u'core.experimentparametervalue': { - 'Meta': {'object_name': 'ExperimentParameterValue'}, - 'boolean_value': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), - 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'db_index': 'True'}), - 'experiment_configuration': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'parameter_value_set'", 'to': u"orm['core.ExperimentConfiguration']"}), - 'float_value': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'int_value': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'last_modified': ('vcweb.core.models.AutoDateTimeField', [], {'default': 'datetime.datetime.now'}), - 'parameter': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Parameter']"}), - 'string_value': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}) - }, - u'core.experimentsession': { - 'Meta': {'object_name': 'ExperimentSession'}, - 'capacity': ('django.db.models.fields.PositiveIntegerField', [], {'default': '20'}), - 'creator': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'experiment_session_set'", 'to': u"orm['auth.User']"}), - 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'experiment_metadata': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'experiment_session_set'", 'to': u"orm['core.ExperimentMetadata']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'invitation_text': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - 'scheduled_date': ('django.db.models.fields.DateTimeField', [], {}), - 'scheduled_end_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) - }, - u'core.group': { - 'Meta': {'ordering': "['experiment', 'number']", 'object_name': 'Group'}, - 'experiment': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Experiment']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'max_size': ('django.db.models.fields.PositiveIntegerField', [], {'default': '5'}), - 'number': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'session_id': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'}) - }, - u'core.groupactivitylog': { - 'Meta': {'object_name': 'GroupActivityLog', '_ormbases': [u'core.ActivityLog']}, - u'activitylog_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['core.ActivityLog']", 'unique': 'True', 'primary_key': 'True'}), - 'group': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_log_set'", 'to': u"orm['core.Group']"}), - 'round_configuration': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.RoundConfiguration']"}) - }, - u'core.groupcluster': { - 'Meta': {'ordering': "['date_created']", 'object_name': 'GroupCluster'}, - 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'experiment': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'group_cluster_set'", 'to': u"orm['core.Experiment']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'}), - 'session_id': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'}) - }, - u'core.groupclusterdatavalue': { - 'Meta': {'object_name': 'GroupClusterDataValue'}, - 'boolean_value': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), - 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'db_index': 'True'}), - 'float_value': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), - 'group_cluster': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.GroupCluster']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'int_value': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'last_modified': ('vcweb.core.models.AutoDateTimeField', [], {'default': 'datetime.datetime.now'}), - 'parameter': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Parameter']"}), - 'round_data': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'group_cluster_data_value_set'", 'to': u"orm['core.RoundData']"}), - 'string_value': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}) - }, - u'core.grouprelationship': { - 'Meta': {'ordering': "['date_created']", 'object_name': 'GroupRelationship'}, - 'cluster': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'group_relationship_set'", 'to': u"orm['core.GroupCluster']"}), - 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'group': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Group']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) - }, - u'core.grouprounddatavalue': { - 'Meta': {'ordering': "['round_data', 'group', 'parameter']", 'object_name': 'GroupRoundDataValue'}, - 'boolean_value': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), - 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'db_index': 'True'}), - 'float_value': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), - 'group': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'data_value_set'", 'to': u"orm['core.Group']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'int_value': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'last_modified': ('vcweb.core.models.AutoDateTimeField', [], {'default': 'datetime.datetime.now'}), - 'parameter': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Parameter']"}), - 'round_data': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'group_data_value_set'", 'to': u"orm['core.RoundData']"}), - 'string_value': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}) - }, - u'core.institution': { - 'Meta': {'object_name': 'Institution'}, - 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'last_modified': ('vcweb.core.models.AutoDateTimeField', [], {'default': 'datetime.datetime.now'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), - 'url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}) - }, - u'core.invitation': { - 'Meta': {'object_name': 'Invitation'}, - 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'experiment_session': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.ExperimentSession']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'participant': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Participant']"}), - 'sender': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}) - }, - u'core.like': { - 'Meta': {'ordering': "['-date_created', 'round_data', 'participant_group_relationship', 'parameter']", 'object_name': 'Like', '_ormbases': [u'core.ParticipantRoundDataValue']}, - u'participantrounddatavalue_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['core.ParticipantRoundDataValue']", 'unique': 'True', 'primary_key': 'True'}) - }, - u'core.parameter': { - 'Meta': {'ordering': "['name']", 'unique_together': "(('name', 'experiment_metadata', 'scope'),)", 'object_name': 'Parameter'}, - 'class_name': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'}), - 'creator': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Experimenter']"}), - 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'default_value_string': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), - 'description': ('django.db.models.fields.CharField', [], {'max_length': '512', 'null': 'True', 'blank': 'True'}), - 'display_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), - 'enum_choices': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - 'experiment_metadata': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.ExperimentMetadata']", 'null': 'True', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_required': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_modified': ('vcweb.core.models.AutoDateTimeField', [], {'default': 'datetime.datetime.now'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), - 'scope': ('django.db.models.fields.CharField', [], {'default': "'round'", 'max_length': '32'}), - 'type': ('django.db.models.fields.CharField', [], {'max_length': '32'}) - }, - u'core.participant': { - 'Meta': {'ordering': "['user']", 'object_name': 'Participant'}, - 'address': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Address']", 'null': 'True', 'blank': 'True'}), - 'authentication_token': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'}), - 'birthdate': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), - 'can_receive_invitations': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'experiments': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'participant_set'", 'symmetrical': 'False', 'through': u"orm['core.ParticipantExperimentRelationship']", 'to': u"orm['core.Experiment']"}), - 'failed_password_attempts': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), - 'gender': ('django.db.models.fields.CharField', [], {'max_length': '1', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'participant_set'", 'symmetrical': 'False', 'through': u"orm['core.ParticipantGroupRelationship']", 'to': u"orm['core.Group']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'institution': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Institution']", 'null': 'True', 'blank': 'True'}), - 'user': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'participant'", 'unique': 'True', 'to': u"orm['auth.User']"}) - }, - u'core.participantexperimentrelationship': { - 'Meta': {'object_name': 'ParticipantExperimentRelationship'}, - 'additional_data': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}), - 'current_location': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'}), - 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'experiment': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'participant_relationship_set'", 'to': u"orm['core.Experiment']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'last_completed_round_sequence_number': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), - 'participant': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'experiment_relationship_set'", 'to': u"orm['core.Participant']"}), - 'participant_identifier': ('django.db.models.fields.CharField', [], {'max_length': '32'}), - 'sequential_participant_identifier': ('django.db.models.fields.PositiveIntegerField', [], {}) - }, - u'core.participantgrouprelationship': { - 'Meta': {'ordering': "['group', 'participant_number']", 'object_name': 'ParticipantGroupRelationship'}, - 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'first_visit': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'group': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'participant_group_relationship_set'", 'to': u"orm['core.Group']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'notifications_since': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'null': 'True', 'blank': 'True'}), - 'participant': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'participant_group_relationship_set'", 'to': u"orm['core.Participant']"}), - 'participant_number': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'round_joined': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.RoundConfiguration']"}) - }, - u'core.participantrounddatavalue': { - 'Meta': {'ordering': "['-date_created', 'round_data', 'participant_group_relationship', 'parameter']", 'object_name': 'ParticipantRoundDataValue'}, - 'boolean_value': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), - 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'db_index': 'True'}), - 'float_value': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'int_value': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'last_modified': ('vcweb.core.models.AutoDateTimeField', [], {'default': 'datetime.datetime.now'}), - 'parameter': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Parameter']"}), - 'participant_group_relationship': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'data_value_set'", 'to': u"orm['core.ParticipantGroupRelationship']"}), - 'round_data': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'participant_data_value_set'", 'to': u"orm['core.RoundData']"}), - 'string_value': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - 'submitted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'target_data_value': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'target_data_value_set'", 'null': 'True', 'to': u"orm['core.ParticipantRoundDataValue']"}) - }, - u'core.participantsignup': { - 'Meta': {'object_name': 'ParticipantSignup'}, - 'attendance': ('django.db.models.fields.PositiveIntegerField', [], {'max_length': '1', 'null': 'True', 'blank': 'True'}), - 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'invitation': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'signup_set'", 'to': u"orm['core.Invitation']"}), - 'participant': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'signup_set'", 'to': u"orm['core.Participant']"}) - }, - u'core.quizquestion': { - 'Meta': {'object_name': 'QuizQuestion'}, - 'answer': ('django.db.models.fields.CharField', [], {'max_length': '64'}), - 'experiment': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'default_quiz_question_set'", 'null': 'True', 'to': u"orm['core.Experiment']"}), - 'explanation': ('django.db.models.fields.CharField', [], {'max_length': '512'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'input_type': ('django.db.models.fields.CharField', [], {'max_length': '32'}), - 'label': ('django.db.models.fields.CharField', [], {'max_length': '512'}), - 'round_configuration': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'quiz_question_set'", 'to': u"orm['core.RoundConfiguration']"}) - }, - u'core.roundconfiguration': { - 'Meta': {'ordering': "['experiment_configuration', 'sequence_number', 'date_created']", 'object_name': 'RoundConfiguration'}, - 'chat_enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'create_group_clusters': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'debriefing': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - 'display_number': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), - 'duration': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), - 'experiment_configuration': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'round_configuration_set'", 'to': u"orm['core.ExperimentConfiguration']"}), - 'group_cluster_size': ('django.db.models.fields.PositiveIntegerField', [], {'default': '2'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'instructions': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - 'last_modified': ('vcweb.core.models.AutoDateTimeField', [], {'default': 'datetime.datetime.now'}), - 'preserve_existing_groups': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'randomize_groups': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'repeat': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), - 'round_type': ('django.db.models.fields.CharField', [], {'default': "'REGULAR'", 'max_length': '32'}), - 'sequence_number': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'session_id': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'}), - 'survey_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), - 'template_name': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'}) - }, - u'core.rounddata': { - 'Meta': {'ordering': "['round_configuration']", 'unique_together': "(('round_configuration', 'experiment'),)", 'object_name': 'RoundData'}, - 'elapsed_time': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), - 'experiment': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'round_data_set'", 'to': u"orm['core.Experiment']"}), - 'experimenter_notes': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'round_configuration': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'round_data_set'", 'to': u"orm['core.RoundConfiguration']"}) - }, - u'core.roundparametervalue': { - 'Meta': {'object_name': 'RoundParameterValue'}, - 'boolean_value': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), - 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'db_index': 'True'}), - 'float_value': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'int_value': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'last_modified': ('vcweb.core.models.AutoDateTimeField', [], {'default': 'datetime.datetime.now'}), - 'parameter': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Parameter']"}), - 'round_configuration': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'parameter_value_set'", 'to': u"orm['core.RoundConfiguration']"}), - 'string_value': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}) - }, - u'core.spoolparticipantstatistics': { - 'Meta': {'object_name': 'SpoolParticipantStatistics'}, - 'absences': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), - 'discharges': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'invitations': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), - 'participant': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'spool_statistics_set'", 'to': u"orm['core.Participant']"}), - 'participations': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}) - } - } - - complete_apps = ['core', 'bound'] - symmetrical = True diff -r 971eb6e04082f34076f61841698e2d5948088421 -r 29104e6b13f704aa1a7c9ca0278b42e57d173be7 vcweb/bound/models.py --- a/vcweb/bound/models.py +++ b/vcweb/bound/models.py @@ -71,7 +71,7 @@ ''' round and experiment configuration accessors ''' def get_regrowth_rate(round_configuration): - return round_configuration.get_parameter_value(parameter=get_regrowth_rate_parameter(), default=0.40).float_value + return round_configuration.get_parameter_value(name='regrowth_rate', default=0.40).float_value def can_observe_other_group(round_configuration): diff -r 971eb6e04082f34076f61841698e2d5948088421 -r 29104e6b13f704aa1a7c9ca0278b42e57d173be7 vcweb/core/migrations/0005_auto__add_field_rounddata_repeating_round_sequence_number.py --- /dev/null +++ b/vcweb/core/migrations/0005_auto__add_field_rounddata_repeating_round_sequence_number.py @@ -0,0 +1,401 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding field 'RoundData.repeating_round_sequence_number' + db.add_column(u'core_rounddata', 'repeating_round_sequence_number', + self.gf('django.db.models.fields.PositiveIntegerField')(default=0), + keep_default=False) + + + def backwards(self, orm): + # Deleting field 'RoundData.repeating_round_sequence_number' + db.delete_column(u'core_rounddata', 'repeating_round_sequence_number') + + + models = { + u'auth.group': { + 'Meta': {'object_name': 'Group'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'auth.permission': { + 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + u'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + u'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + u'core.activitylog': { + 'Meta': {'object_name': 'ActivityLog'}, + 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'log_message': ('django.db.models.fields.TextField', [], {}) + }, + u'core.address': { + 'Meta': {'object_name': 'Address'}, + 'city': ('django.db.models.fields.CharField', [], {'max_length': '128', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'state': ('django.db.models.fields.CharField', [], {'max_length': '128', 'blank': 'True'}), + 'street1': ('django.db.models.fields.CharField', [], {'max_length': '256'}), + 'street2': ('django.db.models.fields.CharField', [], {'max_length': '256'}), + 'zipcode': ('django.db.models.fields.CharField', [], {'max_length': '8', 'blank': 'True'}) + }, + u'core.chatmessage': { + 'Meta': {'ordering': "['-date_created']", 'object_name': 'ChatMessage', '_ormbases': [u'core.ParticipantRoundDataValue']}, + u'participantrounddatavalue_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['core.ParticipantRoundDataValue']", 'unique': 'True', 'primary_key': 'True'}), + 'target_participant': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'target_participant_chat_message_set'", 'null': 'True', 'to': u"orm['core.ParticipantGroupRelationship']"}) + }, + u'core.comment': { + 'Meta': {'ordering': "['-date_created']", 'object_name': 'Comment', '_ormbases': [u'core.ParticipantRoundDataValue']}, + u'participantrounddatavalue_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['core.ParticipantRoundDataValue']", 'unique': 'True', 'primary_key': 'True'}) + }, + u'core.experiment': { + 'Meta': {'ordering': "['date_created', 'status']", 'object_name': 'Experiment'}, + 'amqp_exchange_name': ('django.db.models.fields.CharField', [], {'default': "'vcweb.default.exchange'", 'max_length': '64'}), + 'authentication_code': ('django.db.models.fields.CharField', [], {'default': "'vcweb.auth.code'", 'max_length': '32'}), + 'current_repeated_round_sequence_number': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'current_round_sequence_number': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1'}), + 'current_round_start_time': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'date_activated': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'duration': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}), + 'experiment_configuration': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.ExperimentConfiguration']"}), + 'experiment_metadata': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.ExperimentMetadata']"}), + 'experimenter': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Experimenter']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_modified': ('vcweb.core.models.AutoDateTimeField', [], {'default': 'datetime.datetime.now'}), + 'status': ('django.db.models.fields.CharField', [], {'default': "'INACTIVE'", 'max_length': '32'}), + 'tick_duration': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}) + }, + u'core.experimentactivitylog': { + 'Meta': {'object_name': 'ExperimentActivityLog', '_ormbases': [u'core.ActivityLog']}, + u'activitylog_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['core.ActivityLog']", 'unique': 'True', 'primary_key': 'True'}), + 'experiment': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_log_set'", 'to': u"orm['core.Experiment']"}), + 'round_configuration': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.RoundConfiguration']"}) + }, + u'core.experimentconfiguration': { + 'Meta': {'ordering': "['experiment_metadata', 'creator', 'date_created']", 'object_name': 'ExperimentConfiguration'}, + 'creator': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'experiment_configuration_set'", 'to': u"orm['core.Experimenter']"}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'exchange_rate': ('django.db.models.fields.DecimalField', [], {'default': '0.2', 'null': 'True', 'max_digits': '6', 'decimal_places': '2', 'blank': 'True'}), + 'experiment_metadata': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'experiment_configuration_set'", 'to': u"orm['core.ExperimentMetadata']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'invitation_subject': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'invitation_text': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'is_experimenter_driven': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_modified': ('vcweb.core.models.AutoDateTimeField', [], {'default': 'datetime.datetime.now'}), + 'max_group_size': ('django.db.models.fields.PositiveIntegerField', [], {'default': '5'}), + 'max_number_of_participants': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'treatment_id': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}) + }, + u'core.experimenter': { + 'Meta': {'ordering': "['user']", 'object_name': 'Experimenter'}, + 'approved': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'authentication_token': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'}), + 'failed_password_attempts': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'institution': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Institution']", 'null': 'True', 'blank': 'True'}), + 'user': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'experimenter'", 'unique': 'True', 'to': u"orm['auth.User']"}) + }, + u'core.experimenterrequest': { + 'Meta': {'object_name': 'ExperimenterRequest'}, + 'approved': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'user': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['auth.User']", 'unique': 'True'}) + }, + u'core.experimentmetadata': { + 'Meta': {'ordering': "['namespace', 'date_created']", 'object_name': 'ExperimentMetadata'}, + 'about_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'default_configuration': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.ExperimentConfiguration']", 'null': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_modified': ('vcweb.core.models.AutoDateTimeField', [], {'default': 'datetime.datetime.now'}), + 'logo_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'namespace': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'short_name': ('django.db.models.fields.SlugField', [], {'max_length': '32', 'unique': 'True', 'null': 'True', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, + u'core.experimentparametervalue': { + 'Meta': {'object_name': 'ExperimentParameterValue'}, + 'boolean_value': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'db_index': 'True'}), + 'experiment_configuration': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'parameter_value_set'", 'to': u"orm['core.ExperimentConfiguration']"}), + 'float_value': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'int_value': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'last_modified': ('vcweb.core.models.AutoDateTimeField', [], {'default': 'datetime.datetime.now'}), + 'parameter': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Parameter']"}), + 'string_value': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}) + }, + u'core.experimentsession': { + 'Meta': {'object_name': 'ExperimentSession'}, + 'capacity': ('django.db.models.fields.PositiveIntegerField', [], {'default': '20'}), + 'creator': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'experiment_session_set'", 'to': u"orm['auth.User']"}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'experiment_metadata': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'experiment_session_set'", 'to': u"orm['core.ExperimentMetadata']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'invitation_text': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'scheduled_date': ('django.db.models.fields.DateTimeField', [], {}), + 'scheduled_end_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + u'core.group': { + 'Meta': {'ordering': "['experiment', 'number']", 'object_name': 'Group'}, + 'experiment': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Experiment']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'max_size': ('django.db.models.fields.PositiveIntegerField', [], {'default': '5'}), + 'number': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'session_id': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'}) + }, + u'core.groupactivitylog': { + 'Meta': {'object_name': 'GroupActivityLog', '_ormbases': [u'core.ActivityLog']}, + u'activitylog_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['core.ActivityLog']", 'unique': 'True', 'primary_key': 'True'}), + 'group': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_log_set'", 'to': u"orm['core.Group']"}), + 'round_configuration': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.RoundConfiguration']"}) + }, + u'core.groupcluster': { + 'Meta': {'ordering': "['date_created']", 'object_name': 'GroupCluster'}, + 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'experiment': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'group_cluster_set'", 'to': u"orm['core.Experiment']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'}), + 'session_id': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'}) + }, + u'core.groupclusterdatavalue': { + 'Meta': {'object_name': 'GroupClusterDataValue'}, + 'boolean_value': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'date_created': ('django.db.models... [truncated message content] |
From: <com...@bi...> - 2013-04-30 00:03:55
|
1 new commit in vcweb: https://bitbucket.org/virtualcommons/vcweb/commits/a9c5e74fad15/ Changeset: a9c5e74fad15 User: alllee Date: 2013-04-30 02:03:17 Summary: updating bound_parameters fixture and cleaning up south migrations on lighterprints, forestry, and bound apps Affected #: 10 files diff -r e7d8d56ee1ae11a7bd0fdb8271495be35675c6d2 -r a9c5e74fad151651643dbbcce2c34dffab247632 vcweb/bound/fixtures/bound_parameters.json --- a/vcweb/bound/fixtures/bound_parameters.json +++ b/vcweb/bound/fixtures/bound_parameters.json @@ -1,52 +1,60 @@ [ { "fields": { - "name":"player_status", - "experiment_metadata": 1, - "creator": 1, - "type": "int", - "date_created": "2011-01-01 15:13:03", - "last_modified": "2011-01-01 15:13:05", - "scope": "participant" + "name":"player_status", + "creator": 1, + "type": "boolean", + "date_created": "2011-01-01 15:13:03", + "last_modified": "2011-01-01 15:13:05", + "scope": "participant" }, "model": "core.parameter", "pk": 1111 }, { "fields": { - "name":"cost_of_living", - "experiment_metadata": 1, - "creator": 1, - "type": "float", - "date_created": "2011-01-01 15:13:03", - "last_modified": "2011-01-01 15:13:05", - "scope": "round" + "name":"cost_of_living", + "creator": 1, + "type": "int", + "date_created": "2011-01-01 15:13:03", + "last_modified": "2011-01-01 15:13:05", + "scope": "round" }, "model": "core.parameter", "pk": 1113 }, { "fields": { - "name":"shared_resource", - "experiment_metadata": 1, - "creator": 1, - "type": "boolean", - "date_created": "2011-01-01 15:13:03", - "last_modified": "2011-01-01 15:13:05", - "scope": "round" + "name":"shared_resource", + "creator": 1, + "type": "boolean", + "date_created": "2011-01-01 15:13:03", + "last_modified": "2011-01-01 15:13:05", + "scope": "round" }, "model": "core.parameter", "pk": 1114 }, { "fields": { - "name":"storage", - "experiment_metadata": 1, - "creator": 1, - "type": "int", - "date_created": "2011-01-01 15:13:07", - "last_modified": "2011-01-01 15:15:05", - "scope": "participant" + "name":"max_harvest_decision", + "creator": 1, + "type": "int", + "date_created": "2011-01-01 15:13:03", + "last_modified": "2011-01-01 15:13:05", + "scope": "round" + }, + "model": "core.parameter", + "pk": 1116 + }, + { + "fields": { + "name":"storage", + "creator": 1, + "type": "int", + "date_created": "2011-01-01 15:13:07", + "last_modified": "2011-01-01 15:15:05", + "scope": "participant" }, "model": "core.parameter", "pk": 1115 diff -r e7d8d56ee1ae11a7bd0fdb8271495be35675c6d2 -r a9c5e74fad151651643dbbcce2c34dffab247632 vcweb/bound/migrations/0002_max_harvest_decision.py --- a/vcweb/bound/migrations/0002_max_harvest_decision.py +++ /dev/null @@ -1,405 +0,0 @@ -# -*- coding: utf-8 -*- -import datetime -from south.db import db -from south.v2 import DataMigration -from django.db import models - -class Migration(DataMigration): - - def forwards(self, orm): - "Write your forwards methods here." - # Note: Remember to use orm['appname.ModelName'] rather than "from appname.models..." - Parameter = orm['core.Parameter'] - Experimenter = orm['core.Experimenter'] - Parameter.objects.create(name='max_harvest_decision', - creator=Experimenter.objects.get(pk=1), - type='int', - scope='experiment', - default_value_string='10', - description='Maximum harvest decision a player can make in a typical harvesting experiment') - - - def backwards(self, orm): - "Write your backwards methods here." - - models = { - u'auth.group': { - 'Meta': {'object_name': 'Group'}, - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - u'auth.permission': { - 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - u'auth.user': { - 'Meta': {'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) - }, - u'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - }, - u'core.activitylog': { - 'Meta': {'object_name': 'ActivityLog'}, - 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'log_message': ('django.db.models.fields.TextField', [], {}) - }, - u'core.address': { - 'Meta': {'object_name': 'Address'}, - 'city': ('django.db.models.fields.CharField', [], {'max_length': '128', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'state': ('django.db.models.fields.CharField', [], {'max_length': '128', 'blank': 'True'}), - 'street1': ('django.db.models.fields.CharField', [], {'max_length': '256'}), - 'street2': ('django.db.models.fields.CharField', [], {'max_length': '256'}), - 'zipcode': ('django.db.models.fields.CharField', [], {'max_length': '8', 'blank': 'True'}) - }, - u'core.chatmessage': { - 'Meta': {'ordering': "['date_created']", 'object_name': 'ChatMessage', '_ormbases': [u'core.ParticipantRoundDataValue']}, - u'participantrounddatavalue_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['core.ParticipantRoundDataValue']", 'unique': 'True', 'primary_key': 'True'}), - 'target_participant': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'target_participant_chat_message_set'", 'null': 'True', 'to': u"orm['core.ParticipantGroupRelationship']"}) - }, - u'core.comment': { - 'Meta': {'ordering': "['date_created']", 'object_name': 'Comment', '_ormbases': [u'core.ParticipantRoundDataValue']}, - u'participantrounddatavalue_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['core.ParticipantRoundDataValue']", 'unique': 'True', 'primary_key': 'True'}) - }, - u'core.experiment': { - 'Meta': {'ordering': "['date_created', 'status']", 'object_name': 'Experiment'}, - 'amqp_exchange_name': ('django.db.models.fields.CharField', [], {'default': "'vcweb.default.exchange'", 'max_length': '64'}), - 'authentication_code': ('django.db.models.fields.CharField', [], {'default': "'vcweb.auth.code'", 'max_length': '32'}), - 'current_repeated_round_sequence_number': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), - 'current_round_elapsed_time': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), - 'current_round_sequence_number': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1'}), - 'current_round_start_time': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), - 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'duration': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}), - 'experiment_configuration': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.ExperimentConfiguration']"}), - 'experiment_metadata': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.ExperimentMetadata']"}), - 'experimenter': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Experimenter']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'last_modified': ('vcweb.core.models.AutoDateTimeField', [], {'default': 'datetime.datetime.now'}), - 'start_date_time': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), - 'status': ('django.db.models.fields.CharField', [], {'default': "'INACTIVE'", 'max_length': '32'}), - 'tick_duration': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}), - 'total_elapsed_time': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}) - }, - u'core.experimentactivitylog': { - 'Meta': {'object_name': 'ExperimentActivityLog', '_ormbases': [u'core.ActivityLog']}, - u'activitylog_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['core.ActivityLog']", 'unique': 'True', 'primary_key': 'True'}), - 'experiment': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_log_set'", 'to': u"orm['core.Experiment']"}), - 'round_configuration': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.RoundConfiguration']"}) - }, - u'core.experimentconfiguration': { - 'Meta': {'ordering': "['experiment_metadata', 'creator', 'date_created']", 'object_name': 'ExperimentConfiguration'}, - 'creator': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'experiment_configuration_set'", 'to': u"orm['core.Experimenter']"}), - 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'exchange_rate': ('django.db.models.fields.DecimalField', [], {'default': '0.2', 'null': 'True', 'max_digits': '6', 'decimal_places': '2', 'blank': 'True'}), - 'experiment_metadata': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'experiment_configuration_set'", 'to': u"orm['core.ExperimentMetadata']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'invitation_subject': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - 'invitation_text': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - 'is_experimenter_driven': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_modified': ('vcweb.core.models.AutoDateTimeField', [], {'default': 'datetime.datetime.now'}), - 'max_group_size': ('django.db.models.fields.PositiveIntegerField', [], {'default': '5'}), - 'max_number_of_participants': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'treatment_id': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}) - }, - u'core.experimenter': { - 'Meta': {'ordering': "['user']", 'object_name': 'Experimenter'}, - 'approved': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'authentication_token': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'}), - 'failed_password_attempts': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'institution': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Institution']", 'null': 'True', 'blank': 'True'}), - 'user': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'experimenter'", 'unique': 'True', 'to': u"orm['auth.User']"}) - }, - u'core.experimenterrequest': { - 'Meta': {'object_name': 'ExperimenterRequest'}, - 'approved': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'user': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['auth.User']", 'unique': 'True'}) - }, - u'core.experimentmetadata': { - 'Meta': {'ordering': "['namespace', 'date_created']", 'object_name': 'ExperimentMetadata'}, - 'about_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), - 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'default_configuration': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.ExperimentConfiguration']", 'null': 'True', 'blank': 'True'}), - 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'last_modified': ('vcweb.core.models.AutoDateTimeField', [], {'default': 'datetime.datetime.now'}), - 'logo_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), - 'namespace': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), - 'short_name': ('django.db.models.fields.SlugField', [], {'max_length': '32', 'unique': 'True', 'null': 'True', 'blank': 'True'}), - 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}) - }, - u'core.experimentparametervalue': { - 'Meta': {'object_name': 'ExperimentParameterValue'}, - 'boolean_value': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), - 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'db_index': 'True'}), - 'experiment_configuration': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'parameter_value_set'", 'to': u"orm['core.ExperimentConfiguration']"}), - 'float_value': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'int_value': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'last_modified': ('vcweb.core.models.AutoDateTimeField', [], {'default': 'datetime.datetime.now'}), - 'parameter': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Parameter']"}), - 'string_value': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}) - }, - u'core.experimentsession': { - 'Meta': {'object_name': 'ExperimentSession'}, - 'capacity': ('django.db.models.fields.PositiveIntegerField', [], {'default': '20'}), - 'creator': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'experiment_session_set'", 'to': u"orm['auth.User']"}), - 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'experiment_metadata': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'experiment_session_set'", 'to': u"orm['core.ExperimentMetadata']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'invitation_text': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - 'scheduled_date': ('django.db.models.fields.DateTimeField', [], {}), - 'scheduled_end_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) - }, - u'core.group': { - 'Meta': {'ordering': "['experiment', 'number']", 'object_name': 'Group'}, - 'experiment': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Experiment']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'max_size': ('django.db.models.fields.PositiveIntegerField', [], {'default': '5'}), - 'number': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'session_id': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'}) - }, - u'core.groupactivitylog': { - 'Meta': {'object_name': 'GroupActivityLog', '_ormbases': [u'core.ActivityLog']}, - u'activitylog_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['core.ActivityLog']", 'unique': 'True', 'primary_key': 'True'}), - 'group': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_log_set'", 'to': u"orm['core.Group']"}), - 'round_configuration': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.RoundConfiguration']"}) - }, - u'core.groupcluster': { - 'Meta': {'ordering': "['date_created']", 'object_name': 'GroupCluster'}, - 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'experiment': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'group_cluster_set'", 'to': u"orm['core.Experiment']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'}), - 'session_id': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'}) - }, - u'core.groupclusterdatavalue': { - 'Meta': {'object_name': 'GroupClusterDataValue'}, - 'boolean_value': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), - 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'db_index': 'True'}), - 'float_value': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), - 'group_cluster': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.GroupCluster']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'int_value': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'last_modified': ('vcweb.core.models.AutoDateTimeField', [], {'default': 'datetime.datetime.now'}), - 'parameter': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Parameter']"}), - 'round_data': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'group_cluster_data_value_set'", 'to': u"orm['core.RoundData']"}), - 'string_value': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}) - }, - u'core.grouprelationship': { - 'Meta': {'ordering': "['date_created']", 'object_name': 'GroupRelationship'}, - 'cluster': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'group_relationship_set'", 'to': u"orm['core.GroupCluster']"}), - 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'group': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Group']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) - }, - u'core.grouprounddatavalue': { - 'Meta': {'ordering': "['round_data', 'group', 'parameter']", 'object_name': 'GroupRoundDataValue'}, - 'boolean_value': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), - 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'db_index': 'True'}), - 'float_value': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), - 'group': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'data_value_set'", 'to': u"orm['core.Group']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'int_value': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'last_modified': ('vcweb.core.models.AutoDateTimeField', [], {'default': 'datetime.datetime.now'}), - 'parameter': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Parameter']"}), - 'round_data': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'group_data_value_set'", 'to': u"orm['core.RoundData']"}), - 'string_value': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}) - }, - u'core.institution': { - 'Meta': {'object_name': 'Institution'}, - 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'last_modified': ('vcweb.core.models.AutoDateTimeField', [], {'default': 'datetime.datetime.now'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), - 'url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}) - }, - u'core.invitation': { - 'Meta': {'object_name': 'Invitation'}, - 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'experiment_session': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.ExperimentSession']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'participant': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Participant']"}), - 'sender': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}) - }, - u'core.like': { - 'Meta': {'ordering': "['-date_created', 'round_data', 'participant_group_relationship', 'parameter']", 'object_name': 'Like', '_ormbases': [u'core.ParticipantRoundDataValue']}, - u'participantrounddatavalue_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['core.ParticipantRoundDataValue']", 'unique': 'True', 'primary_key': 'True'}) - }, - u'core.parameter': { - 'Meta': {'ordering': "['name']", 'unique_together': "(('name', 'experiment_metadata', 'scope'),)", 'object_name': 'Parameter'}, - 'class_name': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'}), - 'creator': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Experimenter']"}), - 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'default_value_string': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), - 'description': ('django.db.models.fields.CharField', [], {'max_length': '512', 'null': 'True', 'blank': 'True'}), - 'display_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), - 'enum_choices': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - 'experiment_metadata': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.ExperimentMetadata']", 'null': 'True', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_required': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_modified': ('vcweb.core.models.AutoDateTimeField', [], {'default': 'datetime.datetime.now'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), - 'scope': ('django.db.models.fields.CharField', [], {'default': "'round'", 'max_length': '32'}), - 'type': ('django.db.models.fields.CharField', [], {'max_length': '32'}) - }, - u'core.participant': { - 'Meta': {'ordering': "['user']", 'object_name': 'Participant'}, - 'address': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Address']", 'null': 'True', 'blank': 'True'}), - 'authentication_token': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'}), - 'birthdate': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), - 'can_receive_invitations': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'experiments': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'participant_set'", 'symmetrical': 'False', 'through': u"orm['core.ParticipantExperimentRelationship']", 'to': u"orm['core.Experiment']"}), - 'failed_password_attempts': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), - 'gender': ('django.db.models.fields.CharField', [], {'max_length': '1', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'participant_set'", 'symmetrical': 'False', 'through': u"orm['core.ParticipantGroupRelationship']", 'to': u"orm['core.Group']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'institution': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Institution']", 'null': 'True', 'blank': 'True'}), - 'user': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'participant'", 'unique': 'True', 'to': u"orm['auth.User']"}) - }, - u'core.participantexperimentrelationship': { - 'Meta': {'object_name': 'ParticipantExperimentRelationship'}, - 'additional_data': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}), - 'current_location': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'}), - 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'experiment': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'participant_relationship_set'", 'to': u"orm['core.Experiment']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'last_completed_round_sequence_number': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), - 'participant': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'experiment_relationship_set'", 'to': u"orm['core.Participant']"}), - 'participant_identifier': ('django.db.models.fields.CharField', [], {'max_length': '32'}), - 'sequential_participant_identifier': ('django.db.models.fields.PositiveIntegerField', [], {}) - }, - u'core.participantgrouprelationship': { - 'Meta': {'ordering': "['group', 'participant_number']", 'object_name': 'ParticipantGroupRelationship'}, - 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'first_visit': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'group': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'participant_group_relationship_set'", 'to': u"orm['core.Group']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'notifications_since': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'null': 'True', 'blank': 'True'}), - 'participant': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'participant_group_relationship_set'", 'to': u"orm['core.Participant']"}), - 'participant_number': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'round_joined': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.RoundConfiguration']"}) - }, - u'core.participantrounddatavalue': { - 'Meta': {'ordering': "['-date_created', 'round_data', 'participant_group_relationship', 'parameter']", 'object_name': 'ParticipantRoundDataValue'}, - 'boolean_value': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), - 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'db_index': 'True'}), - 'float_value': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'int_value': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'last_modified': ('vcweb.core.models.AutoDateTimeField', [], {'default': 'datetime.datetime.now'}), - 'parameter': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Parameter']"}), - 'participant_group_relationship': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'data_value_set'", 'to': u"orm['core.ParticipantGroupRelationship']"}), - 'round_data': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'participant_data_value_set'", 'to': u"orm['core.RoundData']"}), - 'string_value': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - 'submitted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'target_data_value': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'target_data_value_set'", 'null': 'True', 'to': u"orm['core.ParticipantRoundDataValue']"}) - }, - u'core.participantsignup': { - 'Meta': {'object_name': 'ParticipantSignup'}, - 'attendance': ('django.db.models.fields.PositiveIntegerField', [], {'max_length': '1', 'null': 'True', 'blank': 'True'}), - 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'invitation': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'signup_set'", 'to': u"orm['core.Invitation']"}), - 'participant': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'signup_set'", 'to': u"orm['core.Participant']"}) - }, - u'core.quizquestion': { - 'Meta': {'object_name': 'QuizQuestion'}, - 'answer': ('django.db.models.fields.CharField', [], {'max_length': '64'}), - 'experiment': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'default_quiz_question_set'", 'null': 'True', 'to': u"orm['core.Experiment']"}), - 'explanation': ('django.db.models.fields.CharField', [], {'max_length': '512'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'input_type': ('django.db.models.fields.CharField', [], {'max_length': '32'}), - 'label': ('django.db.models.fields.CharField', [], {'max_length': '512'}), - 'round_configuration': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'quiz_question_set'", 'to': u"orm['core.RoundConfiguration']"}) - }, - u'core.roundconfiguration': { - 'Meta': {'ordering': "['experiment_configuration', 'sequence_number', 'date_created']", 'object_name': 'RoundConfiguration'}, - 'chat_enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'create_group_clusters': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'debriefing': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - 'display_number': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), - 'duration': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), - 'experiment_configuration': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'round_configuration_set'", 'to': u"orm['core.ExperimentConfiguration']"}), - 'group_cluster_size': ('django.db.models.fields.PositiveIntegerField', [], {'default': '2'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'instructions': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - 'last_modified': ('vcweb.core.models.AutoDateTimeField', [], {'default': 'datetime.datetime.now'}), - 'preserve_existing_groups': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'randomize_groups': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'repeat': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), - 'round_type': ('django.db.models.fields.CharField', [], {'default': "'REGULAR'", 'max_length': '32'}), - 'sequence_number': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'session_id': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'}), - 'survey_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), - 'template_name': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'}) - }, - u'core.rounddata': { - 'Meta': {'ordering': "['round_configuration']", 'unique_together': "(('round_configuration', 'experiment'),)", 'object_name': 'RoundData'}, - 'elapsed_time': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), - 'experiment': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'round_data_set'", 'to': u"orm['core.Experiment']"}), - 'experimenter_notes': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'round_configuration': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'round_data_set'", 'to': u"orm['core.RoundConfiguration']"}) - }, - u'core.roundparametervalue': { - 'Meta': {'object_name': 'RoundParameterValue'}, - 'boolean_value': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), - 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'db_index': 'True'}), - 'float_value': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'int_value': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'last_modified': ('vcweb.core.models.AutoDateTimeField', [], {'default': 'datetime.datetime.now'}), - 'parameter': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Parameter']"}), - 'round_configuration': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'parameter_value_set'", 'to': u"orm['core.RoundConfiguration']"}), - 'string_value': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}) - }, - u'core.spoolparticipantstatistics': { - 'Meta': {'object_name': 'SpoolParticipantStatistics'}, - 'absences': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), - 'discharges': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'invitations': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), - 'participant': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'spool_statistics_set'", 'to': u"orm['core.Participant']"}), - 'participations': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}) - } - } - - complete_apps = ['core', 'bound'] - symmetrical = True diff -r e7d8d56ee1ae11a7bd0fdb8271495be35675c6d2 -r a9c5e74fad151651643dbbcce2c34dffab247632 vcweb/core/migrations/0006_auto__del_unique_rounddata_round_configuration_experiment__add_unique_.py --- /dev/null +++ b/vcweb/core/migrations/0006_auto__del_unique_rounddata_round_configuration_experiment__add_unique_.py @@ -0,0 +1,405 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Removing unique constraint on 'RoundData', fields ['round_configuration', 'experiment'] + db.delete_unique(u'core_rounddata', ['round_configuration_id', 'experiment_id']) + + # Adding unique constraint on 'RoundData', fields ['round_configuration', 'repeating_round_sequence_number', 'experiment'] + db.create_unique(u'core_rounddata', ['round_configuration_id', 'repeating_round_sequence_number', 'experiment_id']) + + + def backwards(self, orm): + # Removing unique constraint on 'RoundData', fields ['round_configuration', 'repeating_round_sequence_number', 'experiment'] + db.delete_unique(u'core_rounddata', ['round_configuration_id', 'repeating_round_sequence_number', 'experiment_id']) + + # Adding unique constraint on 'RoundData', fields ['round_configuration', 'experiment'] + db.create_unique(u'core_rounddata', ['round_configuration_id', 'experiment_id']) + + + models = { + u'auth.group': { + 'Meta': {'object_name': 'Group'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'auth.permission': { + 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + u'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + u'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + u'core.activitylog': { + 'Meta': {'object_name': 'ActivityLog'}, + 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'log_message': ('django.db.models.fields.TextField', [], {}) + }, + u'core.address': { + 'Meta': {'object_name': 'Address'}, + 'city': ('django.db.models.fields.CharField', [], {'max_length': '128', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'state': ('django.db.models.fields.CharField', [], {'max_length': '128', 'blank': 'True'}), + 'street1': ('django.db.models.fields.CharField', [], {'max_length': '256'}), + 'street2': ('django.db.models.fields.CharField', [], {'max_length': '256'}), + 'zipcode': ('django.db.models.fields.CharField', [], {'max_length': '8', 'blank': 'True'}) + }, + u'core.chatmessage': { + 'Meta': {'ordering': "['-date_created']", 'object_name': 'ChatMessage', '_ormbases': [u'core.ParticipantRoundDataValue']}, + u'participantrounddatavalue_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['core.ParticipantRoundDataValue']", 'unique': 'True', 'primary_key': 'True'}), + 'target_participant': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'target_participant_chat_message_set'", 'null': 'True', 'to': u"orm['core.ParticipantGroupRelationship']"}) + }, + u'core.comment': { + 'Meta': {'ordering': "['-date_created']", 'object_name': 'Comment', '_ormbases': [u'core.ParticipantRoundDataValue']}, + u'participantrounddatavalue_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['core.ParticipantRoundDataValue']", 'unique': 'True', 'primary_key': 'True'}) + }, + u'core.experiment': { + 'Meta': {'ordering': "['date_created', 'status']", 'object_name': 'Experiment'}, + 'amqp_exchange_name': ('django.db.models.fields.CharField', [], {'default': "'vcweb.default.exchange'", 'max_length': '64'}), + 'authentication_code': ('django.db.models.fields.CharField', [], {'default': "'vcweb.auth.code'", 'max_length': '32'}), + 'current_repeated_round_sequence_number': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'current_round_sequence_number': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1'}), + 'current_round_start_time': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'date_activated': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'duration': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}), + 'experiment_configuration': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.ExperimentConfiguration']"}), + 'experiment_metadata': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.ExperimentMetadata']"}), + 'experimenter': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Experimenter']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_modified': ('vcweb.core.models.AutoDateTimeField', [], {'default': 'datetime.datetime.now'}), + 'status': ('django.db.models.fields.CharField', [], {'default': "'INACTIVE'", 'max_length': '32'}), + 'tick_duration': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}) + }, + u'core.experimentactivitylog': { + 'Meta': {'object_name': 'ExperimentActivityLog', '_ormbases': [u'core.ActivityLog']}, + u'activitylog_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['core.ActivityLog']", 'unique': 'True', 'primary_key': 'True'}), + 'experiment': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_log_set'", 'to': u"orm['core.Experiment']"}), + 'round_configuration': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.RoundConfiguration']"}) + }, + u'core.experimentconfiguration': { + 'Meta': {'ordering': "['experiment_metadata', 'creator', 'date_created']", 'object_name': 'ExperimentConfiguration'}, + 'creator': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'experiment_configuration_set'", 'to': u"orm['core.Experimenter']"}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'exchange_rate': ('django.db.models.fields.DecimalField', [], {'default': '0.2', 'null': 'True', 'max_digits': '6', 'decimal_places': '2', 'blank': 'True'}), + 'experiment_metadata': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'experiment_configuration_set'", 'to': u"orm['core.ExperimentMetadata']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'invitation_subject': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'invitation_text': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'is_experimenter_driven': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_modified': ('vcweb.core.models.AutoDateTimeField', [], {'default': 'datetime.datetime.now'}), + 'max_group_size': ('django.db.models.fields.PositiveIntegerField', [], {'default': '5'}), + 'max_number_of_participants': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'treatment_id': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}) + }, + u'core.experimenter': { + 'Meta': {'ordering': "['user']", 'object_name': 'Experimenter'}, + 'approved': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'authentication_token': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'}), + 'failed_password_attempts': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'institution': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Institution']", 'null': 'True', 'blank': 'True'}), + 'user': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'experimenter'", 'unique': 'True', 'to': u"orm['auth.User']"}) + }, + u'core.experimenterrequest': { + 'Meta': {'object_name': 'ExperimenterRequest'}, + 'approved': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'user': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['auth.User']", 'unique': 'True'}) + }, + u'core.experimentmetadata': { + 'Meta': {'ordering': "['namespace', 'date_created']", 'object_name': 'ExperimentMetadata'}, + 'about_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'default_configuration': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.ExperimentConfiguration']", 'null': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_modified': ('vcweb.core.models.AutoDateTimeField', [], {'default': 'datetime.datetime.now'}), + 'logo_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'namespace': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'short_name': ('django.db.models.fields.SlugField', [], {'max_length': '32', 'unique': 'True', 'null': 'True', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, + u'core.experimentparametervalue': { + 'Meta': {'object_name': 'ExperimentParameterValue'}, + 'boolean_value': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'db_index': 'True'}), + 'experiment_configuration': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'parameter_value_set'", 'to': u"orm['core.ExperimentConfiguration']"}), + 'float_value': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'int_value': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'last_modified': ('vcweb.core.models.AutoDateTimeField', [], {'default': 'datetime.datetime.now'}), + 'parameter': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Parameter']"}), + 'string_value': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}) + }, + u'core.experimentsession': { + 'Meta': {'object_name': 'ExperimentSession'}, + 'capacity': ('django.db.models.fields.PositiveIntegerField', [], {'default': '20'}), + 'creator': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'experiment_session_set'", 'to': u"orm['auth.User']"}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'experiment_metadata': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'experiment_session_set'", 'to': u"orm['core.ExperimentMetadata']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'invitation_text': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'scheduled_date': ('django.db.models.fields.DateTimeField', [], {}), + 'scheduled_end_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + u'core.group': { + 'Meta': {'ordering': "['experiment', 'number']", 'object_name': 'Group'}, + 'experiment': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Experiment']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'max_size': ('django.db.models.fields.PositiveIntegerField', [], {'default': '5'}), + 'number': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'session_id': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'}) + }, + u'core.groupactivitylog': { + 'Meta': {'object_name': 'GroupActivityLog', '_ormbases': [u'core.ActivityLog']}, + u'activitylog_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['core.ActivityLog']", 'unique': 'True', 'primary_key': 'True'}), + 'group': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_log_set'", 'to': u"orm['core.Group']"}), + 'round_configuration': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.RoundConfiguration']"}) + }, + u'core.groupcluster': { + 'Meta': {'ordering': "['date_created']", 'object_name': 'GroupCluster'}, + 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'experiment': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'group_cluster_set'", 'to': u"orm['core.Experiment']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'}), + 'session_id': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'}) + }, + u'core.groupclusterdatavalue': { + 'Meta': {'object_name': 'GroupClusterDataValue'}, + 'boolean_value': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'db_index': 'True'}), + 'float_value': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), + 'group_cluster': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'data_value_set'", 'to': u"orm['core.GroupCluster']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'int_value': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'last_modified': ('vcweb.core.models.AutoDateTimeField', [], {'default': 'datetime.datetime.now'}), + 'parameter': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Parameter']"}), + 'round_data': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'group_cluster_data_value_set'", 'to': u"orm['core.RoundData']"}), + 'string_value': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}) + }, + u'core.grouprelationship': { + ... [truncated message content] |
From: <com...@bi...> - 2013-04-29 21:05:25
|
3 new commits in vcweb: https://bitbucket.org/virtualcommons/vcweb/commits/ce8c92611696/ Changeset: ce8c92611696 User: alllee Date: 2013-04-24 20:50:29 Summary: performance tuning experiment monitor page, using select_related to avoid n+1 selects Affected #: 2 files diff -r 4fd1977f47f9ada45643703aa3713f4b2a339e36 -r ce8c92611696403ba8ab4c9fc6bcb35ba752dfe5 vcweb/core/models.py --- a/vcweb/core/models.py +++ b/vcweb/core/models.py @@ -527,7 +527,7 @@ @property def all_chat_messages(self): - return ChatMessage.objects.filter(round_data__experiment=self).reverse() + return ChatMessage.objects.for_experiment(self) @property def next_round(self): @@ -1929,12 +1929,18 @@ class ChatMessageQuerySet(models.query.QuerySet): + def for_experiment(self, experiment=None, **kwargs): + return self.select_related( + 'parameter', + 'participant_group_relationship__participant__user', + 'participant_group_relationship__group', + ).filter(parameter=get_chat_message_parameter(), round_data__experiment=experiment, **kwargs) + def for_group(self, group=None, **kwargs): return self.select_related( 'parameter', 'participant_group_relationship__participant__user', 'participant_group_relationship__group', - 'target_data_value__participant_group_relationship', ).filter(parameter=get_chat_message_parameter(), participant_group_relationship__group=group, **kwargs).order_by('-date_created') def message_all(self, experiment, message, round_data=None, **kwargs): @@ -1991,7 +1997,7 @@ return u"{0}: {1}".format(participant_number, self.value) class Meta: - ordering = ['date_created'] + ordering = ['-date_created'] class Comment(ParticipantRoundDataValue): def __init__(self, *args, **kwargs): @@ -2008,7 +2014,7 @@ return data class Meta: - ordering = ['date_created'] + ordering = ['-date_created'] class Like(ParticipantRoundDataValue): def __init__(self, *args, **kwargs): diff -r 4fd1977f47f9ada45643703aa3713f4b2a339e36 -r ce8c92611696403ba8ab4c9fc6bcb35ba752dfe5 vcweb/core/views.py --- a/vcweb/core/views.py +++ b/vcweb/core/views.py @@ -274,7 +274,6 @@ user = request.user if is_experimenter(user, experiment.experimenter): registered_participants = [ { "group": pgr.group, "participant_group_relationship": pgr } for pgr in experiment.participant_group_relationships ] - logger.debug("registered participants: %s", registered_participants) return render(request, 'experimenter/monitor.html', { 'experiment': experiment, 'registeredParticipants': registered_participants, https://bitbucket.org/virtualcommons/vcweb/commits/7f58688dad47/ Changeset: 7f58688dad47 User: alllee Date: 2013-04-29 21:12:56 Summary: replacing generator expressions with lazy querysets Affected #: 2 files diff -r ce8c92611696403ba8ab4c9fc6bcb35ba752dfe5 -r 7f58688dad472850fccc2a7229dfde95eb25aaf0 vcweb/core/models.py --- a/vcweb/core/models.py +++ b/vcweb/core/models.py @@ -324,12 +324,9 @@ currently unused, but kept here in the event that we want to allow participants to authenticate with this authentication_code either in lieu or in addition to their own user password. """ - current_round_sequence_number = models.PositiveIntegerField(default=1, help_text=_('''Used to identify which round the - experiment is currently running, should be a sequential number ranging from 1 to N''')) - """ Each round is assigned a sequential sequence number, ranging from 1 to N. Used to identify which round the - experiment is currently running. """ - current_repeated_round_sequence_number = models.PositiveIntegerField(default=0, help_text=_('''For repeating rounds, - the number of times the round has been repeated, used to keep track of when to move on from a repeating round.''')) + current_round_sequence_number = models.PositiveIntegerField(default=1, help_text=_('''One-based sequence number used to identify which round the experiment is currently running, should be a sequential number ranging from 1 to N''')) + """ Each round is assigned a sequential sequence number, ranging from 1 to N. Used to identify which round the experiment is currently running. """ + current_repeated_round_sequence_number = models.PositiveIntegerField(default=0, help_text=_('''For repeating rounds, the number of times the round has been repeated, used to keep track of when to move on from a repeating round.''')) experimenter = models.ForeignKey(Experimenter) """ the user running this experiment """ experiment_metadata = models.ForeignKey(ExperimentMetadata) @@ -432,7 +429,7 @@ @property def groups(self): - return (group for group in self.group_set.filter(session_id=self.current_session_id)) + return self.group_set.filter(session_id=self.current_session_id) @property def active_group_clusters(self): @@ -440,10 +437,7 @@ @property def participant_group_relationships(self): - ''' - Generator function for all active participant group relationships in this experiment - ''' - return itertools.chain.from_iterable(group.participant_group_relationship_set.all() for group in self.groups) + return ParticipantGroupRelationship.objects.select_related('group').filter(group__in=self.groups) @property def display_name(self): @@ -537,13 +531,6 @@ return self.current_round @property - def next_round_instructions(self): - if self.has_next_round: - return self.next_round.instructions - else: - return u'This is the final round.' - - @property def previous_round(self): # FIXME: loop instead w/ mod? return self.get_round_configuration(max(self.current_round_sequence_number - 1, 1)) @@ -869,6 +856,7 @@ raise AttributeError("Invalid experiment action %s requested of experiment %s" % (action_name, self)) def advance_to_next_round(self): + # FIXME: need to add repeating round logic if self.is_round_in_progress: self.end_round() if self.has_next_round: @@ -878,7 +866,12 @@ logger.warning("trying to advance past the last round - no-op") def create_round_data(self): - round_data, created = self.round_data_set.get_or_create(round_configuration=self.current_round) + current_round_configuration = self.current_round + ps = dict(round_configuration=current_round_configuration) + if current_round_configuration.is_repeating_round: + # create round data with repeating sequence number + ps['repeating_round_sequence_number'] = current_round_configuration.current_repeated_round_sequence_number + round_data, created = self.round_data_set.get_or_create(**ps) if self.experiment_configuration.is_experimenter_driven: # create participant ready data values for every round in experimenter driven experiments logger.debug("creating participant ready participant round data values") @@ -1150,6 +1143,10 @@ return self.sequence_number if self.display_number == 0 else self.display_number @property + def is_repeating_round(self): + return self.repeat > 0 + + @property def is_debriefing_round(self): return self.round_type == RoundConfiguration.RoundType.DEBRIEFING @@ -1658,6 +1655,7 @@ """ experiment = models.ForeignKey(Experiment, related_name='round_data_set') round_configuration = models.ForeignKey(RoundConfiguration, related_name='round_data_set') + repeating_round_sequence_number = models.PositiveIntegerField(default=0, help_text=_('''Repeating round's sequence number used to disambiguate round data in repeating rounds.''')) elapsed_time = models.PositiveIntegerField(default=0) experimenter_notes = models.TextField(null=True, blank=True) diff -r ce8c92611696403ba8ab4c9fc6bcb35ba752dfe5 -r 7f58688dad472850fccc2a7229dfde95eb25aaf0 vcweb/forestry/views.py --- a/vcweb/forestry/views.py +++ b/vcweb/forestry/views.py @@ -117,7 +117,7 @@ class ParticipateView(SingleObjectTemplateResponseMixin, ParticipantSingleExperimentMixin, View): template_name_field = 'current_round_template' -# FIXME: refactor the conditional logic here. +# FIXME: refactor, replace conditional logic here with embedded KO templates @participant_required def participate(request, experiment_id=None): participant = request.user.participant @@ -131,7 +131,6 @@ if current_round.is_instructions_round: return render_to_response(experiment.current_round_template, { 'participant_experiment_relationship': participant_experiment_relationship, - 'next_round_instructions': experiment.next_round_instructions }, context_instance=RequestContext(request)) https://bitbucket.org/virtualcommons/vcweb/commits/e7d8d56ee1ae/ Changeset: e7d8d56ee1ae User: alllee Date: 2013-04-29 23:05:12 Summary: replacing defunct KO references to chat_message.message with chat_message.value adding migration for round_data.repeating_round_sequence_number (still needs work) Affected #: 2 files diff -r 7f58688dad472850fccc2a7229dfde95eb25aaf0 -r e7d8d56ee1ae11a7bd0fdb8271495be35675c6d2 vcweb/core/migrations/0005_auto__add_field_rounddata_repeating_round_sequence_number.py --- /dev/null +++ b/vcweb/core/migrations/0005_auto__add_field_rounddata_repeating_round_sequence_number.py @@ -0,0 +1,401 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding field 'RoundData.repeating_round_sequence_number' + db.add_column(u'core_rounddata', 'repeating_round_sequence_number', + self.gf('django.db.models.fields.PositiveIntegerField')(default=0), + keep_default=False) + + + def backwards(self, orm): + # Deleting field 'RoundData.repeating_round_sequence_number' + db.delete_column(u'core_rounddata', 'repeating_round_sequence_number') + + + models = { + u'auth.group': { + 'Meta': {'object_name': 'Group'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'auth.permission': { + 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + u'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + u'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + u'core.activitylog': { + 'Meta': {'object_name': 'ActivityLog'}, + 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'log_message': ('django.db.models.fields.TextField', [], {}) + }, + u'core.address': { + 'Meta': {'object_name': 'Address'}, + 'city': ('django.db.models.fields.CharField', [], {'max_length': '128', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'state': ('django.db.models.fields.CharField', [], {'max_length': '128', 'blank': 'True'}), + 'street1': ('django.db.models.fields.CharField', [], {'max_length': '256'}), + 'street2': ('django.db.models.fields.CharField', [], {'max_length': '256'}), + 'zipcode': ('django.db.models.fields.CharField', [], {'max_length': '8', 'blank': 'True'}) + }, + u'core.chatmessage': { + 'Meta': {'ordering': "['-date_created']", 'object_name': 'ChatMessage', '_ormbases': [u'core.ParticipantRoundDataValue']}, + u'participantrounddatavalue_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['core.ParticipantRoundDataValue']", 'unique': 'True', 'primary_key': 'True'}), + 'target_participant': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'target_participant_chat_message_set'", 'null': 'True', 'to': u"orm['core.ParticipantGroupRelationship']"}) + }, + u'core.comment': { + 'Meta': {'ordering': "['-date_created']", 'object_name': 'Comment', '_ormbases': [u'core.ParticipantRoundDataValue']}, + u'participantrounddatavalue_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['core.ParticipantRoundDataValue']", 'unique': 'True', 'primary_key': 'True'}) + }, + u'core.experiment': { + 'Meta': {'ordering': "['date_created', 'status']", 'object_name': 'Experiment'}, + 'amqp_exchange_name': ('django.db.models.fields.CharField', [], {'default': "'vcweb.default.exchange'", 'max_length': '64'}), + 'authentication_code': ('django.db.models.fields.CharField', [], {'default': "'vcweb.auth.code'", 'max_length': '32'}), + 'current_repeated_round_sequence_number': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'current_round_sequence_number': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1'}), + 'current_round_start_time': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'date_activated': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'duration': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}), + 'experiment_configuration': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.ExperimentConfiguration']"}), + 'experiment_metadata': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.ExperimentMetadata']"}), + 'experimenter': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Experimenter']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_modified': ('vcweb.core.models.AutoDateTimeField', [], {'default': 'datetime.datetime.now'}), + 'status': ('django.db.models.fields.CharField', [], {'default': "'INACTIVE'", 'max_length': '32'}), + 'tick_duration': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}) + }, + u'core.experimentactivitylog': { + 'Meta': {'object_name': 'ExperimentActivityLog', '_ormbases': [u'core.ActivityLog']}, + u'activitylog_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['core.ActivityLog']", 'unique': 'True', 'primary_key': 'True'}), + 'experiment': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_log_set'", 'to': u"orm['core.Experiment']"}), + 'round_configuration': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.RoundConfiguration']"}) + }, + u'core.experimentconfiguration': { + 'Meta': {'ordering': "['experiment_metadata', 'creator', 'date_created']", 'object_name': 'ExperimentConfiguration'}, + 'creator': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'experiment_configuration_set'", 'to': u"orm['core.Experimenter']"}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'exchange_rate': ('django.db.models.fields.DecimalField', [], {'default': '0.2', 'null': 'True', 'max_digits': '6', 'decimal_places': '2', 'blank': 'True'}), + 'experiment_metadata': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'experiment_configuration_set'", 'to': u"orm['core.ExperimentMetadata']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'invitation_subject': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'invitation_text': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'is_experimenter_driven': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_modified': ('vcweb.core.models.AutoDateTimeField', [], {'default': 'datetime.datetime.now'}), + 'max_group_size': ('django.db.models.fields.PositiveIntegerField', [], {'default': '5'}), + 'max_number_of_participants': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'treatment_id': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}) + }, + u'core.experimenter': { + 'Meta': {'ordering': "['user']", 'object_name': 'Experimenter'}, + 'approved': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'authentication_token': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'}), + 'failed_password_attempts': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'institution': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Institution']", 'null': 'True', 'blank': 'True'}), + 'user': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'experimenter'", 'unique': 'True', 'to': u"orm['auth.User']"}) + }, + u'core.experimenterrequest': { + 'Meta': {'object_name': 'ExperimenterRequest'}, + 'approved': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'user': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['auth.User']", 'unique': 'True'}) + }, + u'core.experimentmetadata': { + 'Meta': {'ordering': "['namespace', 'date_created']", 'object_name': 'ExperimentMetadata'}, + 'about_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'default_configuration': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.ExperimentConfiguration']", 'null': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_modified': ('vcweb.core.models.AutoDateTimeField', [], {'default': 'datetime.datetime.now'}), + 'logo_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'namespace': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'short_name': ('django.db.models.fields.SlugField', [], {'max_length': '32', 'unique': 'True', 'null': 'True', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, + u'core.experimentparametervalue': { + 'Meta': {'object_name': 'ExperimentParameterValue'}, + 'boolean_value': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'db_index': 'True'}), + 'experiment_configuration': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'parameter_value_set'", 'to': u"orm['core.ExperimentConfiguration']"}), + 'float_value': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'int_value': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'last_modified': ('vcweb.core.models.AutoDateTimeField', [], {'default': 'datetime.datetime.now'}), + 'parameter': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Parameter']"}), + 'string_value': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}) + }, + u'core.experimentsession': { + 'Meta': {'object_name': 'ExperimentSession'}, + 'capacity': ('django.db.models.fields.PositiveIntegerField', [], {'default': '20'}), + 'creator': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'experiment_session_set'", 'to': u"orm['auth.User']"}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'experiment_metadata': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'experiment_session_set'", 'to': u"orm['core.ExperimentMetadata']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'invitation_text': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'scheduled_date': ('django.db.models.fields.DateTimeField', [], {}), + 'scheduled_end_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + u'core.group': { + 'Meta': {'ordering': "['experiment', 'number']", 'object_name': 'Group'}, + 'experiment': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Experiment']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'max_size': ('django.db.models.fields.PositiveIntegerField', [], {'default': '5'}), + 'number': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'session_id': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'}) + }, + u'core.groupactivitylog': { + 'Meta': {'object_name': 'GroupActivityLog', '_ormbases': [u'core.ActivityLog']}, + u'activitylog_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['core.ActivityLog']", 'unique': 'True', 'primary_key': 'True'}), + 'group': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_log_set'", 'to': u"orm['core.Group']"}), + 'round_configuration': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.RoundConfiguration']"}) + }, + u'core.groupcluster': { + 'Meta': {'ordering': "['date_created']", 'object_name': 'GroupCluster'}, + 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'experiment': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'group_cluster_set'", 'to': u"orm['core.Experiment']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'}), + 'session_id': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'}) + }, + u'core.groupclusterdatavalue': { + 'Meta': {'object_name': 'GroupClusterDataValue'}, + 'boolean_value': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'db_index': 'True'}), + 'float_value': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), + 'group_cluster': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'data_value_set'", 'to': u"orm['core.GroupCluster']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'int_value': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'last_modified': ('vcweb.core.models.AutoDateTimeField', [], {'default': 'datetime.datetime.now'}), + 'parameter': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Parameter']"}), + 'round_data': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'group_cluster_data_value_set'", 'to': u"orm['core.RoundData']"}), + 'string_value': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}) + }, + u'core.grouprelationship': { + 'Meta': {'ordering': "['date_created']", 'object_name': 'GroupRelationship'}, + 'cluster': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'group_relationship_set'", 'to': u"orm['core.GroupCluster']"}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'group': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Group']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + u'core.grouprounddatavalue': { + 'Meta': {'ordering': "['round_data', 'group', 'parameter']", 'object_name': 'GroupRoundDataValue'}, + 'boolean_value': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'db_index': 'True'}), + 'float_value': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), + 'group': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'data_value_set'", 'to': u"orm['core.Group']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'int_value': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'last_modified': ('vcweb.core.models.AutoDateTimeField', [], {'default': 'datetime.datetime.now'}), + 'parameter': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Parameter']"}), + 'round_data': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'group_data_value_set'", 'to': u"orm['core.RoundData']"}), + 'string_value': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}) + }, + u'core.institution': { + 'Meta': {'object_name': 'Institution'}, + 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_modified': ('vcweb.core.models.AutoDateTimeField', [], {'default': 'datetime.datetime.now'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}) + }, + u'core.invitation': { + 'Meta': {'object_name': 'Invitation'}, + 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'experiment_session': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.ExperimentSession']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'participant': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Participant']"}), + 'sender': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}) + }, + u'core.like': { + 'Meta': {'ordering': "['-date_created', 'round_data', 'participant_group_relationship', 'parameter']", 'object_name': 'Like', '_ormbases': [u'core.ParticipantRoundDataValue']}, + u'participantrounddatavalue_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['core.ParticipantRoundDataValue']", 'unique': 'True', 'primary_key': 'True'}) + }, + u'core.parameter': { + 'Meta': {'ordering': "['name']", 'unique_together': "(('name', 'experiment_metadata', 'scope'),)", 'object_name': 'Parameter'}, + 'class_name': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'}), + 'creator': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Experimenter']"}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'default_value_string': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.CharField', [], {'max_length': '512', 'null': 'True', 'blank': 'True'}), + 'display_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'enum_choices': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'experiment_metadata': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.ExperimentMetadata']", 'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_required': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_modified': ('vcweb.core.models.AutoDateTimeField', [], {'default': 'datetime.datetime.now'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'scope': ('django.db.models.fields.CharField', [], {'default': "'round'", 'max_length': '32'}), + 'type': ('django.db.models.fields.CharField', [], {'max_length': '32'}) + }, + u'core.participant': { + 'Meta': {'ordering': "['user']", 'object_name': 'Participant'}, + 'address': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Address']", 'null': 'True', 'blank': 'True'}), + 'authentication_token': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'}), + 'birthdate': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'can_receive_invitations': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'experiments': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'participant_set'", 'symmetrical': 'False', 'through': u"orm['core.ParticipantExperimentRelationship']", 'to': u"orm['core.Experiment']"}), + 'failed_password_attempts': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'gender': ('django.db.models.fields.CharField', [], {'max_length': '1', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'participant_set'", 'symmetrical': 'False', 'through': u"orm['core.ParticipantGroupRelationship']", 'to': u"orm['core.Group']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'institution': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Institution']", 'null': 'True', 'blank': 'True'}), + 'user': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'participant'", 'unique': 'True', 'to': u"orm['auth.User']"}) + }, + u'core.participantexperimentrelationship': { + 'Meta': {'object_name': 'ParticipantExperimentRelationship'}, + 'additional_data': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}), + 'current_location': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'experiment': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'participant_relationship_set'", 'to': u"orm['core.Experiment']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_completed_round_sequence_number': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'participant': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'experiment_relationship_set'", 'to': u"orm['core.Participant']"}), + 'participant_identifier': ('django.db.models.fields.CharField', [], {'max_length': '32'}), + 'sequential_participant_identifier': ('django.db.models.fields.PositiveIntegerField', [], {}) + }, + u'core.participantgrouprelationship': { + 'Meta': {'ordering': "['group', 'participant_number']", 'object_name': 'ParticipantGroupRelationship'}, + 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'first_visit': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'group': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'participant_group_relationship_set'", 'to': u"orm['core.Group']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'notifications_since': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'null': 'True', 'blank': 'True'}), + 'participant': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'participant_group_relationship_set'", 'to': u"orm['core.Participant']"}), + 'participant_number': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'round_joined': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.RoundConfiguration']"}) + }, + u'core.participantrounddatavalue': { + 'Meta': {'ordering': "['-date_created', 'round_data', 'participant_group_relationship', 'parameter']", 'object_name': 'ParticipantRoundDataValue'}, + 'boolean_value': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'db_index': 'True'}), + 'float_value': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'int_value': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'last_modified': ('vcweb.core.models.AutoDateTimeField', [], {'default': 'datetime.datetime.now'}), + 'parameter': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Parameter']"}), + 'participant_group_relationship': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'data_value_set'", 'to': u"orm['core.ParticipantGroupRelationship']"}), + 'round_data': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'participant_data_value_set'", 'to': u"orm['core.RoundData']"}), + 'string_value': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'submitted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'target_data_value': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'target_data_value_set'", 'null': 'True', 'to': u"orm['core.ParticipantRoundDataValue']"}) + }, + u'core.participantsignup': { + 'Meta': {'object_name': 'ParticipantSignup'}, + 'attendance': ('django.db.models.fields.PositiveIntegerField', [], {'max_length': '1', 'null': 'True', 'blank': 'True'}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'invitation': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'signup_set'", 'to': u"orm['core.Invitation']"}), + 'participant': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'signup_set'", 'to': u"orm['core.Participant']"}) + }, + u'core.quizquestion': { + 'Meta': {'object_name': 'QuizQuestion'}, + 'answer': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'experiment': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'default_quiz_question_set'", 'null': 'True', 'to': u"orm['core.Experiment']"}), + 'explanation': ('django.db.models.fields.CharField', [], {'max_length': '512'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'input_type': ('django.db.models.fields.CharField', [], {'max_length': '32'}), + 'label': ('django.db.models.fields.CharField', [], {'max_length': '512'}), + 'round_configuration': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'quiz_question_set'", 'to': u"orm['core.RoundConfiguration']"}) + }, + u'core.roundconfiguration': { + 'Meta': {'ordering': "['experiment_configuration', 'sequence_number', 'date_created']", 'object_name': 'RoundConfiguration'}, + 'chat_enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'create_group_clusters': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'debriefing': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'display_number': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'duration': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'experiment_configuration': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'round_configuration_set'", 'to': u"orm['core.ExperimentConfiguration']"}), + 'group_cluster_size': ('django.db.models.fields.PositiveIntegerField', [], {'default': '2', 'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'instructions': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'last_modified': ('vcweb.core.models.AutoDateTimeField', [], {'default': 'datetime.datetime.now'}), + 'preserve_existing_groups': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'randomize_groups': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'repeat': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'round_type': ('django.db.models.fields.CharField', [], {'default': "'REGULAR'", 'max_length': '32'}), + 'sequence_number': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'session_id': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'}), + 'survey_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'template_filename': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'}), + 'template_id': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'blank': 'True'}) + }, + u'core.rounddata': { + 'Meta': {'ordering': "['round_configuration']", 'unique_together': "(('round_configuration', 'experiment'),)", 'object_name': 'RoundData'}, + 'elapsed_time': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'experiment': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'round_data_set'", 'to': u"orm['core.Experiment']"}), + 'experimenter_notes': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'repeating_round_sequence_number': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'round_configuration': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'round_data_set'", 'to': u"orm['core.RoundConfiguration']"}) + }, + u'core.roundparametervalue': { + 'Meta': {'object_name': 'RoundParameterValue'}, + 'boolean_value': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'db_index': 'True'}), + 'float_value': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'int_value': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'last_modified': ('vcweb.core.models.AutoDateTimeField', [], {'default': 'datetime.datetime.now'}), + 'parameter': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Parameter']"}), + 'round_configuration': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'parameter_value_set'", 'to': u"orm['core.RoundConfiguration']"}), + 'string_value': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}) + }, + u'core.spoolparticipantstatistics': { + 'Meta': {'object_name': 'SpoolParticipantStatistics'}, + 'absences': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'discharges': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'invitations': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'participant': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'spool_statistics_set'", 'to': u"orm['core.Participant']"}), + 'participations': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}) + } + } + + complete_apps = ['core'] \ No newline at end of file diff -r 7f58688dad472850fccc2a7229dfde95eb25aaf0 -r e7d8d56ee1ae11a7bd0fdb8271495be35675c6d2 vcweb/lighterprints/templates/lighterprints/participate.html --- a/vcweb/lighterprints/templates/lighterprints/participate.html +++ b/vcweb/lighterprints/templates/lighterprints/participate.html @@ -228,7 +228,7 @@ </div></div></div> - <h3 class='underline'>Group activity</h3> + <h3>Group activity</h3><div data-bind='ifnot: hasGroupActivity() '><div data-bind='template: { name: "no-group-activity-template" }'></div></div> @@ -482,6 +482,7 @@ </span></div></script> +<!-- group activity templates, keyed by parameter name --><script type='text/html' id='comment'><tr data-bind='if: $root.participantGroupId() != participant_group_id()'><td class='group-activity-icon'><i class='icon-comment lighterprints-blue'></i></td> @@ -497,7 +498,7 @@ </span><div><small><i class='icon-quote-left'></i></small> - <span data-bind='text:message'></span> + <span data-bind='text:value'></span><small><i class='icon-quote-right'></i></small></div></div> @@ -530,7 +531,7 @@ <small class='pull-right muted'><span data-bind='text: date_created'></span></small><div><small><i class='icon-quote-left'></i></small> - <span data-bind='text:message'></span> + <span data-bind='text:value'></span><small><i class='icon-quote-right'></i></small></div><div data-bind="template: 'likeCommentTemplate'"></div> 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. |
From: <com...@bi...> - 2013-04-29 09:17:53
|
1 new commit in vcweb: https://bitbucket.org/virtualcommons/vcweb/commits/4fd1977f47f9/ Changeset: 4fd1977f47f9 User: alllee Date: 2013-04-29 11:17:39 Summary: centralizing set_data_value implementation in mixin, fixing fabfile tests and test data loading Affected #: 4 files diff -r 9dc4ddf8ae15c1a828a976bcb8efae5cb4dd7cf7 -r 4fd1977f47f9ada45643703aa3713f4b2a339e36 fabfile.py --- a/fabfile.py +++ b/fabfile.py @@ -25,9 +25,10 @@ env.hosts = ['localhost'] env.hg_url = 'https://bitbucket.org/virtualcommons/vcweb' env.apache = 'httpd' -env.applist = ['core', 'forestry', 'boundaries', 'lighterprints'] +env.applist = ['core', 'forestry', 'bound', 'lighterprints', 'broker'] env.docs_path = os.path.join(env.project_path, 'docs') env.remote_docs_path = '/home/csid/public_html/api/vcweb' +env.testdata_fixtures = 'forestry_experiment_metadata lighterprints_experiment_metadata activities bound_experiment_metadata bound_parameters' env.apps = ' '.join(env.applist) # django integration for access to settings, etc. @@ -54,7 +55,7 @@ def testdata(): syncdb() with cd(env.project_path): - _virtualenv(local, '%(python)s manage.py loaddata forestry_experiment_metadata lighterprints_experiment_metadata bound_experiment_metadata bound_parameters' % env) + _virtualenv(local, '%(python)s manage.py loaddata %(testdata_fixtures)s' % env) def migrate(): local("{python} manage.py migrate".format(python=env.python), capture=False) diff -r 9dc4ddf8ae15c1a828a976bcb8efae5cb4dd7cf7 -r 4fd1977f47f9ada45643703aa3713f4b2a339e36 vcweb/bound/models.py --- a/vcweb/bound/models.py +++ b/vcweb/bound/models.py @@ -71,7 +71,7 @@ ''' round and experiment configuration accessors ''' def get_regrowth_rate(round_configuration): - return round_configuration.get_parameter_value(parameter=get_regrowth_rate_parameter(), default=0.40).float_value + return round_configuration.get_parameter_value(name='regrowth_rate', default=0.40).float_value def can_observe_other_group(round_configuration): diff -r 9dc4ddf8ae15c1a828a976bcb8efae5cb4dd7cf7 -r 4fd1977f47f9ada45643703aa3713f4b2a339e36 vcweb/core/models.py --- a/vcweb/core/models.py +++ b/vcweb/core/models.py @@ -105,8 +105,10 @@ existing_dv.save() def set_data_value(self, parameter=None, value=None, round_data=None, **kwargs): - if parameter is None or value is None or round_data is None: - raise ValueError("need parameter, value, and round data to set") + if parameter is None or value is None: + raise ValueError("need parameter and value to set") + if round_data is None: + round_data = self.current_round_data dv = self.get_data_value(round_data=round_data, parameter=parameter, **kwargs) dv.value = value dv.save() @@ -1558,19 +1560,6 @@ logger.debug("no round configuration value found for parameter (%s, %s) in round: %s", parameter, name, current_round_configuration) return round_configuration_value - def set_data_value(self, parameter=None, value=None, round_data=None, **kwargs): - ''' - Not as efficient as a simple SQL update because we need to do some type - conversion / processing to put the value into the appropriate field. - ''' - if round_data is None: - round_data = self.current_round_data - self.log("setting group param %s => %s" % (parameter, value)) - grdv = GroupRoundDataValue.objects.get(parameter=parameter, round_data=round_data, group=self) - grdv.value = value - grdv.save() - return grdv - def _data_parameter_criteria(self, parameter=None, parameter_name=None, round_data=None, **kwargs): criteria = dict([ ('is_active', True), @@ -1644,15 +1633,6 @@ 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 - gcdv = GroupClusterDataValue.objects.get(group_cluster=self, round_data=round_data, parameter=parameter) - gcdv.value = value - gcdv.save() - def __unicode__(self): return u"GroupCluster #%s %s (%s)" % (self.pk, self.session_id, self.experiment) @@ -1851,20 +1831,6 @@ def get_round_configuration_value(self, **kwargs): return self.group.get_round_configuration_value(**kwargs) - def set_data_value(self, parameter=None, value=None, round_data=None): - if round_data is None: - round_data = self.current_round_data - if parameter is not None and value is not None: - pdv = ParticipantRoundDataValue.objects.get(round_data=round_data, parameter=parameter, participant_group_relationship=self) - pdv.submitted = True - pdv.value = value - pdv.save() - # FIXME: parameterize / make explicit? - return pdv - else: - logger.warning("Unable to set data value %s on round data %s for %s", value, round_data, parameter) - - def __unicode__(self): return u"{0}: #{1} (in {2})".format(self.participant, self.participant_number, self.group) diff -r 9dc4ddf8ae15c1a828a976bcb8efae5cb4dd7cf7 -r 4fd1977f47f9ada45643703aa3713f4b2a339e36 vcweb/core/tests.py --- a/vcweb/core/tests.py +++ b/vcweb/core/tests.py @@ -247,7 +247,7 @@ pass class GroupTest(BaseVcwebTest): - def test_set_data_value_activity_log(self): + def test_set_data_value(self): e = self.advance_to_data_round() test_data_value = 10 for g in e.group_set.all(): @@ -256,8 +256,6 @@ # XXX: pathological use of set_data_value, no point in doing it # this way since typical usage would do a lookup by name. g.set_data_value(parameter=data_value.parameter, value=test_data_value) - activity_log_counter += 1 - self.assertEqual(activity_log_counter, GroupActivityLog.objects.filter(group=g).count()) self.assertEqual(g.get_scalar_data_value(parameter=data_value.parameter), test_data_value) def test_transfer_to_next_round(self): 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. |
From: <com...@bi...> - 2013-04-27 08:39:45
|
1 new commit in vcweb: https://bitbucket.org/virtualcommons/vcweb/commits/971eb6e04082/ Changeset: 971eb6e04082 Branch: stable User: alllee Date: 2013-04-27 10:39:32 Summary: didn't properly copy over conflicted changes in fabfile Affected #: 1 file diff -r a0c438311abc7098e9d5b96911a5327ad481677c -r 971eb6e04082f34076f61841698e2d5948088421 fabfile.py --- a/fabfile.py +++ b/fabfile.py @@ -51,7 +51,12 @@ with cd(env.remote_docs_path): run('find . -type d -exec chmod a+rx {} \; && chmod -R a+r .') +def testdata(): + syncdb() + with cd(env.project_path): + _virtualenv(local, '%(python)s manage.py loaddata forestry_experiment_metadata lighterprints_experiment_metadata bound_experiment_metadata bound_parameters' % env) + def migrate(): local("{python} manage.py migrate".format(python=env.python), capture=False) 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. |
From: <com...@bi...> - 2013-04-27 08:35:34
|
1 new commit in vcweb: https://bitbucket.org/virtualcommons/vcweb/commits/a0c438311abc/ Changeset: a0c438311abc Branch: stable User: alllee Date: 2013-04-27 10:35:18 Summary: merging default -> stable, updated boundaries decision UI prototype and visualization improved sqlite test database creation, use: fab testdata to create a new sqlite database prepopulated with an experimenter and a test lighter footprints experiment with no participants. Affected #: 53 files diff -r 94368fac5f228b55b5629dbd6e3491eb7abe8f01 -r a0c438311abc7098e9d5b96911a5327ad481677c docs/source/conf.py --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -43,7 +43,7 @@ # General information about the project. project = u'vcweb' -copyright = u'2011, Allen Lee' +copyright = u'2013, Arizona Board of Regents' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the diff -r 94368fac5f228b55b5629dbd6e3491eb7abe8f01 -r a0c438311abc7098e9d5b96911a5327ad481677c docs/source/core.rst --- a/docs/source/core.rst +++ b/docs/source/core.rst @@ -6,15 +6,12 @@ 1. participant data generated during the course of a round 2. group data shared across each participant in the group - 3. round and experiment configuration data. + 3. round and experiment configuration parameterizations -Using the forestry experiment as a concrete example, participant data may consist of -a harvest decision in a given round or a chat message sent during a communication -round. Examples of group shared data are the current resource level for a given -group and the amount of regrowth experienced by the group. Round and experiment -configuration data include how many initial trees are provided at the start of the -experiment, how many rounds the experiment should consist of as well as the explicit -ordering of the rounds. +Using the forestry experiment as a concrete example, participant data consists of a harvest decision in a given round or +a chat message. Group shared data consists of the current resource level for a given group and the amount of regrowth +experienced by the group. Round and experiment configuration parameterization data includes how many initial trees are +provided at the start of the experiment, the regrowth rate, the number of rounds, etc. .. automodule:: vcweb.core.models :members: diff -r 94368fac5f228b55b5629dbd6e3491eb7abe8f01 -r a0c438311abc7098e9d5b96911a5327ad481677c vcweb/bound/fixtures/bound_experiment_metadata.json --- /dev/null +++ b/vcweb/bound/fixtures/bound_experiment_metadata.json @@ -0,0 +1,16 @@ +[ + { + "pk": 6, + "model": "core.experimentmetadata", + "fields": { + "description": "The boundary effect experiment manipulates the resource flows and information connections between social groups and ecological resources.", + "short_name": null, + "title": "Boundary Effects Experiment", + "namespace": "bound", + "last_modified": "2012-10-29T16:42:20.880", + "date_created": "2012-10-29T16:42:20.874", + "logo_url": null, + "about_url": "http://commons.asu.edu" + } + } +] diff -r 94368fac5f228b55b5629dbd6e3491eb7abe8f01 -r a0c438311abc7098e9d5b96911a5327ad481677c vcweb/bound/fixtures/bound_parameters.json --- /dev/null +++ b/vcweb/bound/fixtures/bound_parameters.json @@ -0,0 +1,54 @@ +[ + { + "fields": { + "name":"player_status", + "experiment_metadata": 1, + "creator": 1, + "type": "int", + "date_created": "2011-01-01 15:13:03", + "last_modified": "2011-01-01 15:13:05", + "scope": "participant" + }, + "model": "core.parameter", + "pk": 1111 + }, + { + "fields": { + "name":"cost_of_living", + "experiment_metadata": 1, + "creator": 1, + "type": "float", + "date_created": "2011-01-01 15:13:03", + "last_modified": "2011-01-01 15:13:05", + "scope": "round" + }, + "model": "core.parameter", + "pk": 1113 + }, + { + "fields": { + "name":"shared_resource", + "experiment_metadata": 1, + "creator": 1, + "type": "boolean", + "date_created": "2011-01-01 15:13:03", + "last_modified": "2011-01-01 15:13:05", + "scope": "round" + }, + "model": "core.parameter", + "pk": 1114 + }, + { + "fields": { + "name":"storage", + "experiment_metadata": 1, + "creator": 1, + "type": "int", + "date_created": "2011-01-01 15:13:07", + "last_modified": "2011-01-01 15:15:05", + "scope": "participant" + }, + "model": "core.parameter", + "pk": 1115 + } +] diff -r 94368fac5f228b55b5629dbd6e3491eb7abe8f01 -r a0c438311abc7098e9d5b96911a5327ad481677c vcweb/bound/forms.py --- /dev/null +++ b/vcweb/bound/forms.py @@ -0,0 +1,8 @@ +from vcweb.core.forms import ParticipantGroupIdForm, SingleIntegerDecisionForm +from vcweb.forestry import forms + + +class HarvestDecisionForm(forms.HarvestDecisionForm): +# XXX: only used to export HarvestDecisionForm in its own namespace at the moment + pass + diff -r 94368fac5f228b55b5629dbd6e3491eb7abe8f01 -r a0c438311abc7098e9d5b96911a5327ad481677c vcweb/bound/migrations/0001_initial.py --- /dev/null +++ b/vcweb/bound/migrations/0001_initial.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + from django.core.management import call_command + call_command("loaddata", "bound_experiment_metadata.json") + + def backwards(self, orm): + pass + + models = { + + } + + complete_apps = ['bound'] diff -r 94368fac5f228b55b5629dbd6e3491eb7abe8f01 -r a0c438311abc7098e9d5b96911a5327ad481677c vcweb/bound/migrations/0002_max_harvest_decision.py --- /dev/null +++ b/vcweb/bound/migrations/0002_max_harvest_decision.py @@ -0,0 +1,405 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import DataMigration +from django.db import models + +class Migration(DataMigration): + + def forwards(self, orm): + "Write your forwards methods here." + # Note: Remember to use orm['appname.ModelName'] rather than "from appname.models..." + Parameter = orm['core.Parameter'] + Experimenter = orm['core.Experimenter'] + Parameter.objects.create(name='max_harvest_decision', + creator=Experimenter.objects.get(pk=1), + type='int', + scope='experiment', + default_value_string='10', + description='Maximum harvest decision a player can make in a typical harvesting experiment') + + + def backwards(self, orm): + "Write your backwards methods here." + + models = { + u'auth.group': { + 'Meta': {'object_name': 'Group'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'auth.permission': { + 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + u'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + u'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + u'core.activitylog': { + 'Meta': {'object_name': 'ActivityLog'}, + 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'log_message': ('django.db.models.fields.TextField', [], {}) + }, + u'core.address': { + 'Meta': {'object_name': 'Address'}, + 'city': ('django.db.models.fields.CharField', [], {'max_length': '128', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'state': ('django.db.models.fields.CharField', [], {'max_length': '128', 'blank': 'True'}), + 'street1': ('django.db.models.fields.CharField', [], {'max_length': '256'}), + 'street2': ('django.db.models.fields.CharField', [], {'max_length': '256'}), + 'zipcode': ('django.db.models.fields.CharField', [], {'max_length': '8', 'blank': 'True'}) + }, + u'core.chatmessage': { + 'Meta': {'ordering': "['date_created']", 'object_name': 'ChatMessage', '_ormbases': [u'core.ParticipantRoundDataValue']}, + u'participantrounddatavalue_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['core.ParticipantRoundDataValue']", 'unique': 'True', 'primary_key': 'True'}), + 'target_participant': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'target_participant_chat_message_set'", 'null': 'True', 'to': u"orm['core.ParticipantGroupRelationship']"}) + }, + u'core.comment': { + 'Meta': {'ordering': "['date_created']", 'object_name': 'Comment', '_ormbases': [u'core.ParticipantRoundDataValue']}, + u'participantrounddatavalue_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['core.ParticipantRoundDataValue']", 'unique': 'True', 'primary_key': 'True'}) + }, + u'core.experiment': { + 'Meta': {'ordering': "['date_created', 'status']", 'object_name': 'Experiment'}, + 'amqp_exchange_name': ('django.db.models.fields.CharField', [], {'default': "'vcweb.default.exchange'", 'max_length': '64'}), + 'authentication_code': ('django.db.models.fields.CharField', [], {'default': "'vcweb.auth.code'", 'max_length': '32'}), + 'current_repeated_round_sequence_number': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'current_round_elapsed_time': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'current_round_sequence_number': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1'}), + 'current_round_start_time': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'duration': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}), + 'experiment_configuration': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.ExperimentConfiguration']"}), + 'experiment_metadata': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.ExperimentMetadata']"}), + 'experimenter': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Experimenter']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_modified': ('vcweb.core.models.AutoDateTimeField', [], {'default': 'datetime.datetime.now'}), + 'start_date_time': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'status': ('django.db.models.fields.CharField', [], {'default': "'INACTIVE'", 'max_length': '32'}), + 'tick_duration': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}), + 'total_elapsed_time': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}) + }, + u'core.experimentactivitylog': { + 'Meta': {'object_name': 'ExperimentActivityLog', '_ormbases': [u'core.ActivityLog']}, + u'activitylog_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['core.ActivityLog']", 'unique': 'True', 'primary_key': 'True'}), + 'experiment': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_log_set'", 'to': u"orm['core.Experiment']"}), + 'round_configuration': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.RoundConfiguration']"}) + }, + u'core.experimentconfiguration': { + 'Meta': {'ordering': "['experiment_metadata', 'creator', 'date_created']", 'object_name': 'ExperimentConfiguration'}, + 'creator': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'experiment_configuration_set'", 'to': u"orm['core.Experimenter']"}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'exchange_rate': ('django.db.models.fields.DecimalField', [], {'default': '0.2', 'null': 'True', 'max_digits': '6', 'decimal_places': '2', 'blank': 'True'}), + 'experiment_metadata': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'experiment_configuration_set'", 'to': u"orm['core.ExperimentMetadata']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'invitation_subject': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'invitation_text': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'is_experimenter_driven': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_modified': ('vcweb.core.models.AutoDateTimeField', [], {'default': 'datetime.datetime.now'}), + 'max_group_size': ('django.db.models.fields.PositiveIntegerField', [], {'default': '5'}), + 'max_number_of_participants': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'treatment_id': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}) + }, + u'core.experimenter': { + 'Meta': {'ordering': "['user']", 'object_name': 'Experimenter'}, + 'approved': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'authentication_token': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'}), + 'failed_password_attempts': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'institution': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Institution']", 'null': 'True', 'blank': 'True'}), + 'user': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'experimenter'", 'unique': 'True', 'to': u"orm['auth.User']"}) + }, + u'core.experimenterrequest': { + 'Meta': {'object_name': 'ExperimenterRequest'}, + 'approved': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'user': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['auth.User']", 'unique': 'True'}) + }, + u'core.experimentmetadata': { + 'Meta': {'ordering': "['namespace', 'date_created']", 'object_name': 'ExperimentMetadata'}, + 'about_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'default_configuration': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.ExperimentConfiguration']", 'null': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_modified': ('vcweb.core.models.AutoDateTimeField', [], {'default': 'datetime.datetime.now'}), + 'logo_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'namespace': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'short_name': ('django.db.models.fields.SlugField', [], {'max_length': '32', 'unique': 'True', 'null': 'True', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, + u'core.experimentparametervalue': { + 'Meta': {'object_name': 'ExperimentParameterValue'}, + 'boolean_value': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'db_index': 'True'}), + 'experiment_configuration': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'parameter_value_set'", 'to': u"orm['core.ExperimentConfiguration']"}), + 'float_value': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'int_value': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'last_modified': ('vcweb.core.models.AutoDateTimeField', [], {'default': 'datetime.datetime.now'}), + 'parameter': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Parameter']"}), + 'string_value': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}) + }, + u'core.experimentsession': { + 'Meta': {'object_name': 'ExperimentSession'}, + 'capacity': ('django.db.models.fields.PositiveIntegerField', [], {'default': '20'}), + 'creator': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'experiment_session_set'", 'to': u"orm['auth.User']"}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'experiment_metadata': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'experiment_session_set'", 'to': u"orm['core.ExperimentMetadata']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'invitation_text': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'scheduled_date': ('django.db.models.fields.DateTimeField', [], {}), + 'scheduled_end_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + u'core.group': { + 'Meta': {'ordering': "['experiment', 'number']", 'object_name': 'Group'}, + 'experiment': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Experiment']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'max_size': ('django.db.models.fields.PositiveIntegerField', [], {'default': '5'}), + 'number': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'session_id': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'}) + }, + u'core.groupactivitylog': { + 'Meta': {'object_name': 'GroupActivityLog', '_ormbases': [u'core.ActivityLog']}, + u'activitylog_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['core.ActivityLog']", 'unique': 'True', 'primary_key': 'True'}), + 'group': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_log_set'", 'to': u"orm['core.Group']"}), + 'round_configuration': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.RoundConfiguration']"}) + }, + u'core.groupcluster': { + 'Meta': {'ordering': "['date_created']", 'object_name': 'GroupCluster'}, + 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'experiment': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'group_cluster_set'", 'to': u"orm['core.Experiment']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'}), + 'session_id': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'}) + }, + u'core.groupclusterdatavalue': { + 'Meta': {'object_name': 'GroupClusterDataValue'}, + 'boolean_value': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'db_index': 'True'}), + 'float_value': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), + 'group_cluster': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.GroupCluster']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'int_value': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'last_modified': ('vcweb.core.models.AutoDateTimeField', [], {'default': 'datetime.datetime.now'}), + 'parameter': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Parameter']"}), + 'round_data': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'group_cluster_data_value_set'", 'to': u"orm['core.RoundData']"}), + 'string_value': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}) + }, + u'core.grouprelationship': { + 'Meta': {'ordering': "['date_created']", 'object_name': 'GroupRelationship'}, + 'cluster': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'group_relationship_set'", 'to': u"orm['core.GroupCluster']"}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'group': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Group']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + u'core.grouprounddatavalue': { + 'Meta': {'ordering': "['round_data', 'group', 'parameter']", 'object_name': 'GroupRoundDataValue'}, + 'boolean_value': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'db_index': 'True'}), + 'float_value': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), + 'group': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'data_value_set'", 'to': u"orm['core.Group']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'int_value': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'last_modified': ('vcweb.core.models.AutoDateTimeField', [], {'default': 'datetime.datetime.now'}), + 'parameter': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Parameter']"}), + 'round_data': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'group_data_value_set'", 'to': u"orm['core.RoundData']"}), + 'string_value': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}) + }, + u'core.institution': { + 'Meta': {'object_name': 'Institution'}, + 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_modified': ('vcweb.core.models.AutoDateTimeField', [], {'default': 'datetime.datetime.now'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}) + }, + u'core.invitation': { + 'Meta': {'object_name': 'Invitation'}, + 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'experiment_session': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.ExperimentSession']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'participant': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Participant']"}), + 'sender': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}) + }, + u'core.like': { + 'Meta': {'ordering': "['-date_created', 'round_data', 'participant_group_relationship', 'parameter']", 'object_name': 'Like', '_ormbases': [u'core.ParticipantRoundDataValue']}, + u'participantrounddatavalue_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['core.ParticipantRoundDataValue']", 'unique': 'True', 'primary_key': 'True'}) + }, + u'core.parameter': { + 'Meta': {'ordering': "['name']", 'unique_together': "(('name', 'experiment_metadata', 'scope'),)", 'object_name': 'Parameter'}, + 'class_name': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'}), + 'creator': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Experimenter']"}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'default_value_string': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.CharField', [], {'max_length': '512', 'null': 'True', 'blank': 'True'}), + 'display_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'enum_choices': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'experiment_metadata': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.ExperimentMetadata']", 'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_required': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_modified': ('vcweb.core.models.AutoDateTimeField', [], {'default': 'datetime.datetime.now'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'scope': ('django.db.models.fields.CharField', [], {'default': "'round'", 'max_length': '32'}), + 'type': ('django.db.models.fields.CharField', [], {'max_length': '32'}) + }, + u'core.participant': { + 'Meta': {'ordering': "['user']", 'object_name': 'Participant'}, + 'address': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Address']", 'null': 'True', 'blank': 'True'}), + 'authentication_token': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'}), + 'birthdate': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'can_receive_invitations': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'experiments': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'participant_set'", 'symmetrical': 'False', 'through': u"orm['core.ParticipantExperimentRelationship']", 'to': u"orm['core.Experiment']"}), + 'failed_password_attempts': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'gender': ('django.db.models.fields.CharField', [], {'max_length': '1', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'participant_set'", 'symmetrical': 'False', 'through': u"orm['core.ParticipantGroupRelationship']", 'to': u"orm['core.Group']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'institution': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Institution']", 'null': 'True', 'blank': 'True'}), + 'user': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'participant'", 'unique': 'True', 'to': u"orm['auth.User']"}) + }, + u'core.participantexperimentrelationship': { + 'Meta': {'object_name': 'ParticipantExperimentRelationship'}, + 'additional_data': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}), + 'current_location': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'experiment': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'participant_relationship_set'", 'to': u"orm['core.Experiment']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_completed_round_sequence_number': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'participant': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'experiment_relationship_set'", 'to': u"orm['core.Participant']"}), + 'participant_identifier': ('django.db.models.fields.CharField', [], {'max_length': '32'}), + 'sequential_participant_identifier': ('django.db.models.fields.PositiveIntegerField', [], {}) + }, + u'core.participantgrouprelationship': { + 'Meta': {'ordering': "['group', 'participant_number']", 'object_name': 'ParticipantGroupRelationship'}, + 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'first_visit': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'group': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'participant_group_relationship_set'", 'to': u"orm['core.Group']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'notifications_since': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'null': 'True', 'blank': 'True'}), + 'participant': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'participant_group_relationship_set'", 'to': u"orm['core.Participant']"}), + 'participant_number': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'round_joined': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.RoundConfiguration']"}) + }, + u'core.participantrounddatavalue': { + 'Meta': {'ordering': "['-date_created', 'round_data', 'participant_group_relationship', 'parameter']", 'object_name': 'ParticipantRoundDataValue'}, + 'boolean_value': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'db_index': 'True'}), + 'float_value': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'int_value': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'last_modified': ('vcweb.core.models.AutoDateTimeField', [], {'default': 'datetime.datetime.now'}), + 'parameter': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Parameter']"}), + 'participant_group_relationship': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'data_value_set'", 'to': u"orm['core.ParticipantGroupRelationship']"}), + 'round_data': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'participant_data_value_set'", 'to': u"orm['core.RoundData']"}), + 'string_value': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'submitted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'target_data_value': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'target_data_value_set'", 'null': 'True', 'to': u"orm['core.ParticipantRoundDataValue']"}) + }, + u'core.participantsignup': { + 'Meta': {'object_name': 'ParticipantSignup'}, + 'attendance': ('django.db.models.fields.PositiveIntegerField', [], {'max_length': '1', 'null': 'True', 'blank': 'True'}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'invitation': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'signup_set'", 'to': u"orm['core.Invitation']"}), + 'participant': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'signup_set'", 'to': u"orm['core.Participant']"}) + }, + u'core.quizquestion': { + 'Meta': {'object_name': 'QuizQuestion'}, + 'answer': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'experiment': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'default_quiz_question_set'", 'null': 'True', 'to': u"orm['core.Experiment']"}), + 'explanation': ('django.db.models.fields.CharField', [], {'max_length': '512'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'input_type': ('django.db.models.fields.CharField', [], {'max_length': '32'}), + 'label': ('django.db.models.fields.CharField', [], {'max_length': '512'}), + 'round_configuration': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'quiz_question_set'", 'to': u"orm['core.RoundConfiguration']"}) + }, + u'core.roundconfiguration': { + 'Meta': {'ordering': "['experiment_configuration', 'sequence_number', 'date_created']", 'object_name': 'RoundConfiguration'}, + 'chat_enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'create_group_clusters': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'debriefing': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'display_number': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'duration': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'experiment_configuration': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'round_configuration_set'", 'to': u"orm['core.ExperimentConfiguration']"}), + 'group_cluster_size': ('django.db.models.fields.PositiveIntegerField', [], {'default': '2'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'instructions': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'last_modified': ('vcweb.core.models.AutoDateTimeField', [], {'default': 'datetime.datetime.now'}), + 'preserve_existing_groups': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'randomize_groups': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'repeat': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'round_type': ('django.db.models.fields.CharField', [], {'default': "'REGULAR'", 'max_length': '32'}), + 'sequence_number': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'session_id': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'}), + 'survey_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'template_name': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'}) + }, + u'core.rounddata': { + 'Meta': {'ordering': "['round_configuration']", 'unique_together': "(('round_configuration', 'experiment'),)", 'object_name': 'RoundData'}, + 'elapsed_time': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'experiment': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'round_data_set'", 'to': u"orm['core.Experiment']"}), + 'experimenter_notes': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'round_configuration': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'round_data_set'", 'to': u"orm['core.RoundConfiguration']"}) + }, + u'core.roundparametervalue': { + 'Meta': {'object_name': 'RoundParameterValue'}, + 'boolean_value': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'db_index': 'True'}), + 'float_value': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'int_value': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'last_modified': ('vcweb.core.models.AutoDateTimeField', [], {'default': 'datetime.datetime.now'}), + 'parameter': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.Parameter']"}), + 'round_configuration': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'parameter_value_set'", 'to': u"orm['core.RoundConfiguration']"}), + 'string_value': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}) + }, + u'core.spoolparticipantstatistics': { + 'Meta': {'object_name': 'SpoolParticipantStatistics'}, + 'absences': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'discharges': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'invitations': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'participant': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'spool_statistics_set'", 'to': u"orm['core.Participant']"}), + 'participations': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}) + } + } + + complete_apps = ['core', 'bound'] + symmetrical = True diff -r 94368fac5f228b55b5629dbd6e3491eb7abe8f01 -r a0c438311abc7098e9d5b96911a5327ad481677c vcweb/bound/models.py --- /dev/null +++ b/vcweb/bound/models.py @@ -0,0 +1,430 @@ +from django.db.models import Sum +from django.dispatch import receiver +from vcweb.core import signals, simplecache +from vcweb.core.models import (ExperimentMetadata, Parameter, ParticipantRoundDataValue, GroupRelationship, + GroupCluster, GroupClusterDataValue, RoundData, RoundConfiguration) +from vcweb.forestry.models import (get_harvest_decision_parameter, get_harvest_decision, get_harvest_decision_dv, get_regrowth_rate_parameter, + get_group_harvest_parameter, get_reset_resource_level_parameter, get_resource_level as get_unshared_resource_level, + get_initial_resource_level as forestry_initial_resource_level, get_regrowth_parameter, set_resource_level, + get_resource_level_parameter, get_resource_level_dv as get_unshared_resource_level_dv, + set_group_harvest, set_regrowth, set_harvest_decision) + +import logging + +logger = logging.getLogger(__name__) + +# FIXME: hacky, should figure out a better way to bind this module with the ExperimentMetadata instance that it is +# dependent on +EXPERIMENT_METADATA_NAME = intern('bound') +# constants that should live in configuration as well +MAX_RESOURCE_LEVEL = 240 +MAX_SHARED_RESOURCE_LEVEL = 480 + +INITIAL_RESOURCES_PER_PARTICIPANT_PER_ROUND = 3 + +''' +Experiment Parameters and Metadata Accessors +''' + + +@simplecache +def get_experiment_metadata(): + return ExperimentMetadata.objects.get(namespace=EXPERIMENT_METADATA_NAME) + + +@simplecache +def get_player_status_parameter(): + return Parameter.objects.for_participant(name='player_status') + + +@simplecache +def get_storage_parameter(): + return Parameter.objects.for_participant(name='storage') + + +@simplecache +def get_survival_cost_parameter(): + return Parameter.objects.for_round(name='survival_cost') + + +@simplecache +def get_max_harvest_decision_parameter(): + return Parameter.objects.for_experiment(name='max_harvest_decision') + + +@simplecache +def get_cost_of_living_parameter(): + return Parameter.objects.for_round(name='cost_of_living') + + +@simplecache +def get_observe_other_group_parameter(): + return Parameter.objects.for_round(name='observe_other_group') + + +@simplecache +def get_shared_resource_enabled_parameter(): + return Parameter.objects.for_round(name='shared_resource') + + +''' value accessors ''' + +''' round and experiment configuration accessors ''' +def get_regrowth_rate(round_configuration): + return round_configuration.get_parameter_value(parameter=get_regrowth_rate_parameter(), default=0.40).float_value + + +def can_observe_other_group(round_configuration): + return round_configuration.get_parameter_value(parameter=get_observe_other_group_parameter(), + default=False).boolean_value + + +def is_shared_resource_enabled(round_configuration): + return round_configuration.get_parameter_value(parameter=get_shared_resource_enabled_parameter(), + default=False).boolean_value + +def get_max_resource_level(round_configuration): + ec = round_configuration.experiment_configuration +# FIXME: number of rounds currently hard coded to be 20 for regular rounds, 10 for practice rounds + number_of_rounds = 20 if round_configuration.is_regular_round else 10 + return INITIAL_RESOURCES_PER_PARTICIPANT_PER_ROUND * ec.max_group_size * number_of_rounds + +def get_initial_resource_level(round_configuration, default=None): + return get_max_resource_level(round_configuration) + +def should_reset_resource_level(round_configuration): + return round_configuration.get_parameter_value(parameter=get_reset_resource_level_parameter(), + default=False).boolean_value + +def get_cost_of_living(round_configuration): + return round_configuration.get_parameter_value(get_cost_of_living_parameter(), default=5).int_value + + +def get_max_harvest_decision(experiment_configuration): + return experiment_configuration.get_parameter_value(parameter=get_max_harvest_decision_parameter(), default=10).int_value + +def get_max_allowed_harvest_decision(participant_group_relationship, round_data=None, experiment_configuration=None): + return get_max_harvest_decision(experiment_configuration) + +def get_resource_level(group, round_data=None, round_configuration=None, cluster=None): + return get_resource_level_dv(group, round_data, round_configuration, cluster).int_value + +''' group data accessors ''' +def get_average_harvest(group, round_data): + return get_total_group_harvest(group, round_data) / float(group.size) + +def get_average_storage(group, round_data): + return get_total_storage(group, round_data) / float(group.size) + +def get_resource_level_dv(group, round_data=None, round_configuration=None, cluster=None): + ''' + Returns either the GroupClusterDataValue (shared resource condition) or the GroupRoundDataValue (standard + resource per group condition) for the given group + ''' + if round_data is None: + round_data = group.current_round_data + if round_configuration is None: + round_configuration = round_data.round_configuration + if is_shared_resource_enabled(round_configuration): + return get_shared_resource_level_dv(group, round_data, cluster) + else: + return get_unshared_resource_level_dv(group, round_data) + + +def get_shared_resource_level(group, round_data=None, cluster=None): + return get_shared_resource_level_dv(group, round_data, cluster).int_value + + +def get_shared_resource_level_dv(group=None, round_data=None, cluster=None): + if round_data is None: + round_data = group.current_round_data + if cluster is None: + group_relationship = GroupRelationship.objects.select_related('group_cluster').get(group=group) + cluster = group_relationship.cluster + return cluster.get_data_value(parameter=get_resource_level_parameter(), round_data=round_data) + +''' participant data value accessors ''' + +def get_storage_dv(participant_group_relationship, round_data=None, default=None): + return participant_group_relationship.get_data_value(parameter=get_storage_parameter(), round_data=round_data, default=default) + + +def get_storage(participant_group_relationship, round_data=None, default=0): + dv = get_storage_dv(participant_group_relationship, round_data, default) + return max(default if dv.int_value is None else dv.int_value, 0) + +def get_all_session_storages(experiment, participant_group_relationship): + debriefing_session_round_data = RoundData.objects.filter(experiment=experiment, + round_configuration__round_type=RoundConfiguration.RoundType.DEBRIEFING, + round_configuration__session_id__isnull=False) + return ParticipantRoundDataValue.objects.filter( + participant_group_relationship=participant_group_relationship, + parameter=get_storage_parameter(), + round_data__in=debriefing_session_round_data).order_by('date_created') + + +def _zero_if_none(value): + return 0 if value is None else value + +def get_total_group_harvest(group, round_data): + q = ParticipantRoundDataValue.objects.for_group(group=group, parameter=get_harvest_decision_parameter(), round_data=round_data).aggregate(total_harvest=Sum('int_value')) + return _zero_if_none(q['total_harvest']) + + +def get_total_harvest(participant_group_relationship, session_id): + q = ParticipantRoundDataValue.objects.for_participant(participant_group_relationship, parameter=get_harvest_decision_parameter(), + participant_group_relationship__group__session_id=session_id).aggregate(total_harvest=Sum('int_value')) + return _zero_if_none(q['total_harvest']) + +# returns the sum of all stored resources for each member in the group +def get_total_storage(group, round_data): + q = ParticipantRoundDataValue.objects.for_group(group=group, parameter=get_storage_parameter(), round_data=round_data).aggregate(total_storage=Sum('int_value')) + return _zero_if_none(q['total_storage']) + +def set_storage(participant_group_relationship, round_data, value): + storage_dv = get_storage_dv(participant_group_relationship, round_data) + storage_dv.int_value = value + storage_dv.save() + return storage_dv + +def get_player_status_dv(participant_group_relationship, round_data, default=True): + return participant_group_relationship.get_data_value(parameter=get_player_status_parameter(), + round_data=round_data, default=default) + +def is_player_alive(participant_group_relationship, round_data, default=True): + return get_player_status_dv(participant_group_relationship, round_data, default).boolean_value + +def get_number_alive(group, round_data): + return ParticipantRoundDataValue.objects.for_group(group, parameter=get_player_status_parameter(), round_data=round_data, boolean_value=True).count() + +def set_player_status(participant_group_relationship, round_data, value): + status_dv = get_player_status_dv(participant_group_relationship, round_data) + status_dv.boolean_value = value + status_dv.save() + return status_dv + +def get_last_harvest_decision(participant_group_relationship, round_data=None): + return participant_group_relationship.get_data_value(parameter=get_harvest_decision_parameter(), + round_data=round_data, default=0).int_value + + +@receiver(signals.round_started, sender=EXPERIMENT_METADATA_NAME) +def round_started_handler(sender, experiment=None, **kwargs): + if experiment is None: + logger.error("Received round started signal with no experiment: %s", sender) + raise ValueError("Received round started signal with no experiment") + round_configuration = experiment.current_round + round_data = experiment.get_round_data(round_configuration) + logger.debug("setting up round %s", round_configuration) + # initialize group and participant data values + if round_configuration.is_playable_round: + experiment.initialize_data_values( + group_cluster_parameters=(get_regrowth_parameter(), get_resource_level_parameter(),), + group_parameters=(get_regrowth_parameter(), get_group_harvest_parameter(), get_resource_level_parameter(),), + participant_parameters=(get_storage_parameter(), get_player_status_parameter(),) + ) +# check for dead participants and set their ready and harvest decision flags + deceased_participants = ParticipantRoundDataValue.objects.select_related('participant_group_relationship').filter(parameter=get_player_status_parameter(), + round_data=round_data, boolean_value=False) + for prdv in deceased_participants: + pgr = prdv.participant_group_relationship + set_harvest_decision(pgr, 0, round_data, submitted=True) + ''' + during a practice or regular round, set up resource levels, participant harvest decision parameters, and group + formation + ''' + if should_reset_resource_level(round_configuration): + initial_resource_level = get_max_resource_level(round_configuration) + logger.debug("Resetting resource level for %s to %d", round_configuration, initial_resource_level) + for group in experiment.group_set.filter(session_id=round_configuration.session_id): + ''' set resource level to initial default ''' + existing_resource_level = get_resource_level_dv(group, round_data, round_configuration) + group.log( + "Setting resource level (%s) to initial value [%s]" % (existing_resource_level, initial_resource_level)) + existing_resource_level.int_value = initial_resource_level + existing_resource_level.save() + # FIXME: verify that this is expected behavior - if the resource level is reset, reset storage to 0 + ParticipantRoundDataValue.objects.for_group(group, parameter=get_storage_parameter(), + round_data=round_data).update(int_value=0) + # reset all player statuses to alive + ParticipantRoundDataValue.objects.for_group(group, parameter=get_player_status_parameter(), + round_data=round_data).update(boolean_value=True) + + + +def adjust_harvest_decisions(current_resource_level, group, round_data, total_harvest, group_size=0): + if group_size == 0: + group_size = group.size +# pass in the group size to handle group cluster case + average_harvest = current_resource_level / group_size + group.log("GROUP HARVEST ADJUSTMENT - original total harvest: %s, resource level: %s, average harvest: %s" % + (total_harvest, current_resource_level, average_harvest)) + hds = ParticipantRoundDataValue.objects.for_group(group=group, parameter=get_harvest_decision_parameter(), + round_data=round_data, int_value__gt=0).order_by('int_value') + total_adjusted_harvest = 0 +# FIXME: should be the same as group.size + total_number_of_decisions = hds.count() + logger.debug("total number of decisions: %s - group size: %s", total_number_of_decisions, group_size) + decisions_allocated = 0 + for hd in hds: + if hd.int_value <= average_harvest: + group.log("preserving %s < average harvest" % hd) + total_adjusted_harvest += hd.int_value + else: +# now to assign the overs, find out how much resource level is remaining + remaining_resource_level = current_resource_level - total_adjusted_harvest + remaining_decisions = total_number_of_decisions - decisions_allocated + average_harvest = remaining_resource_level / remaining_decisions + hd.is_active = False + hd.save() + logger.debug("Assigning %s to hd %s", average_harvest, hd) + ParticipantRoundDataValue.objects.create(participant_group_relationship=hd.participant_group_relationship, + parameter=get_harvest_decision_parameter(), round_data=round_data, int_value=average_harvest, + submitted=True) + total_adjusted_harvest += average_harvest + decisions_allocated += 1 + + logger.debug("harvested total %s", total_adjusted_harvest) + return total_adjusted_harvest + + +def update_resource_level(experiment, group, round_data, regrowth_rate, max_resource_level=None): + if max_resource_level is None: + max_resource_level = get_max_resource_level(round_data.round_configuration) + current_resource_level_dv = get_resource_level_dv(group, round_data) + current_resource_level = current_resource_level_dv.int_value +# FIXME: would be nicer to extend Group behavior and have group.get_total_harvest() instead of +# get_total_group_harvest(group, ...), see if we can enable this dynamically + total_harvest = get_total_group_harvest(group, round_data) + logger.debug("Harvest: total group harvest for playable round: %s", total_harvest) + if current_resource_level > 0: + if total_harvest > current_resource_level: + adjusted_harvest = adjust_harvest_decisions(current_resource_level, group, round_data, total_harvest) + total_harvest = adjusted_harvest + + group.log("Harvest: removing %s from current resource level %s" % (total_harvest, current_resource_level)) + set_group_harvest(group, total_harvest, round_data) + current_resource_level = current_resource_level - total_harvest + resource_regrowth = calculate_regrowth(current_resource_level, regrowth_rate, max_resource_level) + group.log("Regrowth: adding %s to current resource level %s" % (resource_regrowth, current_resource_level)) + set_regrowth(group, resource_regrowth, round_data) + # clamp resource + current_resource_level_dv.int_value = min(current_resource_level + resource_regrowth, max_resource_level) + current_resource_level_dv.save() + else: + group.log("current resource level is 0, no one can harvest") + set_group_harvest(group, 0, round_data) + ParticipantRoundDataValue.objects.for_group(group, parameter=get_harvest_decision_parameter(), + round_data=round_data).update(is_active=False) + for pgr in group.participant_group_relationship_set.all(): + # Create adjusted data values + ParticipantRoundDataValue.objects.cr... [truncated message content] |
From: <com...@bi...> - 2013-04-27 08:26:12
|
2 new commits in vcweb: https://bitbucket.org/virtualcommons/vcweb/commits/8fa20fd5555e/ Changeset: 8fa20fd5555e User: alllee Date: 2013-04-26 23:20:31 Summary: adding test vcweb experimenter to initial data Affected #: 1 file diff -r d0e48e73a1b985b8ebf1d73a7dbbcad871b896d8 -r 8fa20fd5555e006339c56001c4e1090ca152da9d vcweb/core/fixtures/initial_data.json --- a/vcweb/core/fixtures/initial_data.json +++ b/vcweb/core/fixtures/initial_data.json @@ -31,6 +31,35 @@ } }, { + "pk": 256, + "model": "auth.user", + "fields": { + "username": "vc...@ma...", + "first_name": "Test", + "last_name": "Experimenter", + "is_active": true, + "is_superuser": false, + "is_staff": false, + "last_login": "2013-04-26T13:28:34", + "groups": [], + "user_permissions": [], + "password": "pbkdf2_sha256$10000$KDNffwswH525$kgkT27m+3VqMHn1J63P9jPIyOZieDddGcUl8Q5/WopI=", + "email": "vc...@ma...", + "date_joined": "2013-04-26T13:28:34" + } + }, + { + "pk": 8, + "model": "core.experimenter", + "fields": { + "authentication_token": "", + "approved": true, + "user": 256, + "failed_password_attempts": 0, + "institution": 1 + } + }, + { "pk": 1, "model": "core.experimenter", "fields": { https://bitbucket.org/virtualcommons/vcweb/commits/9dc4ddf8ae15/ Changeset: 9dc4ddf8ae15 User: alllee Date: 2013-04-27 10:25:56 Summary: adding testdata fab task to purge and resync sqlite dev database Affected #: 5 files diff -r 8fa20fd5555e006339c56001c4e1090ca152da9d -r 9dc4ddf8ae15c1a828a976bcb8efae5cb4dd7cf7 fabfile.py --- a/fabfile.py +++ b/fabfile.py @@ -51,6 +51,10 @@ with cd(env.remote_docs_path): run('find . -type d -exec chmod a+rx {} \; && chmod -R a+r .') +def testdata(): + syncdb() + with cd(env.project_path): + _virtualenv(local, '%(python)s manage.py loaddata forestry_experiment_metadata lighterprints_experiment_metadata bound_experiment_metadata bound_parameters' % env) def migrate(): local("{python} manage.py migrate".format(python=env.python), capture=False) diff -r 8fa20fd5555e006339c56001c4e1090ca152da9d -r 9dc4ddf8ae15c1a828a976bcb8efae5cb4dd7cf7 vcweb/bound/fixtures/bound_parameters.json --- a/vcweb/bound/fixtures/bound_parameters.json +++ b/vcweb/bound/fixtures/bound_parameters.json @@ -14,19 +14,6 @@ }, { "fields": { - "name":"regrowth_rate", - "experiment_metadata": 1, - "creator": 1, - "type": "float", - "date_created": "2011-01-01 15:13:03", - "last_modified": "2011-01-01 15:13:05", - "scope": "round" - }, - "model": "core.parameter", - "pk": 1112 - }, - { - "fields": { "name":"cost_of_living", "experiment_metadata": 1, "creator": 1, diff -r 8fa20fd5555e006339c56001c4e1090ca152da9d -r 9dc4ddf8ae15c1a828a976bcb8efae5cb4dd7cf7 vcweb/forestry/fixtures/forestry_experiment_metadata.json --- a/vcweb/forestry/fixtures/forestry_experiment_metadata.json +++ b/vcweb/forestry/fixtures/forestry_experiment_metadata.json @@ -1,326 +1,346 @@ [ - { - "pk": 1, - "model": "core.experimentmetadata", - "fields": { - "description": "A web-based version of forestry field experiments (Cardenas, Janssen and Bousquet).", - "short_name": null, - "title": "Forestry Experiment", - "namespace": "forestry", - "default_configuration": null, - "last_modified": "2012-04-02T00:21:44.960", - "date_created": "2012-04-02", - "logo_url": null, - "about_url": "http://commons.asu.edu" - } +{ + "pk": 1, + "model": "core.experimentmetadata", + "fields": { + "description": "A web-based version of forestry field experiments (Cardenas, Janssen and Bousquet).", + "short_name": null, + "title": "Forestry Experiment", + "namespace": "forestry", + "default_configuration": null, + "last_modified": "2012-04-02T00:21:44.960", + "date_created": "2012-04-02", + "logo_url": null, + "about_url": "http://commons.asu.edu" + } +}, +{ + "fields": { + "creator": 1, + "experiment_metadata": [ + "forestry" + ], + "is_public": true, + "max_group_size": 5, + "name": "Forestry Default Configuration", + "date_created": "2010-09-07", + "is_experimenter_driven": true, + "last_modified": "2010-09-07 16:13:03" }, - { - "fields": { - "creator": 1, - "experiment_metadata": [ - "forestry" - ], - "is_public": true, - "max_group_size": 5, - "name": "Forestry Default Configuration", - "date_created": "2010-09-07", - "is_experimenter_driven": true, - "last_modified": "2010-09-07 16:13:03" - }, - "model": "core.experimentconfiguration", - "pk": 1 + "model": "core.experimentconfiguration", + "pk": 1 +}, +{ + "fields": { + "authentication_code": "TEST_FORESTRY", + "current_round_sequence_number": 1, + "duration": "1h", + "experiment_configuration": 1, + "experiment_metadata": 1, + "experimenter": 1, + "status": "INACTIVE", + "tick_duration": "10s", + "date_created": "2010-09-07", + "last_modified": "2010-09-07 12:23:37" }, - { - "fields": { - "authentication_code": "TEST_FORESTRY", - "current_round_sequence_number": 1, - "duration": "1h", - "experiment_configuration": 1, - "experiment_metadata": 1, - "experimenter": 1, - "status": "INACTIVE", - "tick_duration": "10s", - "date_created": "2010-09-07", - "last_modified": "2010-09-07 12:23:37" - }, - "model": "core.experiment", - "pk": 1 + "model": "core.experiment", + "pk": 1 +}, +{ + "pk": 34, + "model": "core.experiment", + "fields": { + "experiment_metadata": 1, + "status": "INACTIVE", + "tick_duration": "", + "authentication_code": "vcweb.auth.code", + "current_round_start_time": null, + "last_modified": "2013-04-27T01:22:22.957", + "experimenter": 8, + "date_activated": null, + "current_round_sequence_number": 1, + "duration": "", + "date_created": "2013-04-27T01:21:39", + "experiment_configuration": 1, + "current_repeated_round_sequence_number": 0, + "amqp_exchange_name": "vcweb.default.exchange" + } +}, +{ + "fields": { + "date_created": "2010-09-07 15:13:03", + "duration": 0, + "experiment_configuration": 1, + "instructions": "Welcome to the forestry experiment.", + "last_modified": "2010-09-07 15:13:03", + "round_type": "INSTRUCTIONS", + "sequence_number": 1 }, - { - "fields": { - "date_created": "2010-09-07 15:13:03", - "duration": 0, - "experiment_configuration": 1, - "instructions": "Welcome to the forestry experiment.", - "last_modified": "2010-09-07 15:13:03", - "round_type": "INSTRUCTIONS", - "sequence_number": 1 - }, - "model": "core.roundconfiguration", - "pk": 1 + "model": "core.roundconfiguration", + "pk": 1 +}, +{ + "fields": { + "date_created": "2010-09-07 15:13:03", + "duration": 0, + "experiment_configuration": 1, + "instructions": "The following quiz is designed to ensure you understand the dynamics of this experiment.", + "last_modified": "2010-09-07 15:13:03", + "round_type": "PRACTICE", + "sequence_number": 2 }, - { - "fields": { - "date_created": "2010-09-07 15:13:03", - "duration": 0, - "experiment_configuration": 1, - "instructions": "The following quiz is designed to ensure you understand the dynamics of this experiment.", - "last_modified": "2010-09-07 15:13:03", - "round_type": "PRACTICE", - "sequence_number": 2 - }, - "model": "core.roundconfiguration", - "pk": 2 + "model": "core.roundconfiguration", + "pk": 2 +}, +{ + "fields": { + "date_created": "2010-09-07 15:13:03", + "duration": 60, + "experiment_configuration": 1, + "instructions": "This is a practice round.", + "last_modified": "2010-09-07 15:13:03", + "round_type": "PRACTICE", + "sequence_number": 3 }, - { - "fields": { - "date_created": "2010-09-07 15:13:03", - "duration": 60, - "experiment_configuration": 1, - "instructions": "This is a practice round.", - "last_modified": "2010-09-07 15:13:03", - "round_type": "PRACTICE", - "sequence_number": 3 - }, - "model": "core.roundconfiguration", - "pk": 3 + "model": "core.roundconfiguration", + "pk": 3 +}, +{ + "fields": { + "date_created": "2010-09-07 15:13:03", + "duration": 60, + "experiment_configuration": 1, + "instructions": "Chat round.", + "last_modified": "2010-09-07 15:13:03", + "round_type": "CHAT", + "sequence_number": 4 }, - { - "fields": { - "date_created": "2010-09-07 15:13:03", - "duration": 60, - "experiment_configuration": 1, - "instructions": "Chat round.", - "last_modified": "2010-09-07 15:13:03", - "round_type": "CHAT", - "sequence_number": 4 - }, - "model": "core.roundconfiguration", - "pk": 4 + "model": "core.roundconfiguration", + "pk": 4 +}, +{ + "fields": { + "date_created": "2010-09-07 15:13:03", + "duration": 60, + "experiment_configuration": 1, + "instructions": "This is a practice round.", + "last_modified": "2010-09-07 15:13:03", + "round_type": "PRACTICE", + "sequence_number": 5 }, - { - "fields": { - "date_created": "2010-09-07 15:13:03", - "duration": 60, - "experiment_configuration": 1, - "instructions": "This is a practice round.", - "last_modified": "2010-09-07 15:13:03", - "round_type": "PRACTICE", - "sequence_number": 5 - }, - "model": "core.roundconfiguration", - "pk": 5 + "model": "core.roundconfiguration", + "pk": 5 +}, +{ + "fields": { + "date_created": "2010-09-07 15:13:03", + "duration": 60, + "experiment_configuration": 1, + "instructions": "An actual forestry round.", + "last_modified": "2010-09-07 15:13:03", + "round_type": "REGULAR", + "display_number": 1, + "sequence_number": 6 }, - { - "fields": { - "date_created": "2010-09-07 15:13:03", - "duration": 60, - "experiment_configuration": 1, - "instructions": "An actual forestry round.", - "last_modified": "2010-09-07 15:13:03", - "round_type": "REGULAR", - "display_number": 1, - "sequence_number": 6 - }, - "model": "core.roundconfiguration", - "pk": 6 + "model": "core.roundconfiguration", + "pk": 6 +}, +{ + "fields": { + "date_created": "2010-09-07 15:13:03", + "duration": 60, + "experiment_configuration": 1, + "instructions": "Chat round.", + "last_modified": "2010-09-07 15:13:03", + "round_type": "CHAT", + "sequence_number": 7 }, - { - "fields": { - "date_created": "2010-09-07 15:13:03", - "duration": 60, - "experiment_configuration": 1, - "instructions": "Chat round.", - "last_modified": "2010-09-07 15:13:03", - "round_type": "CHAT", - "sequence_number": 7 - }, - "model": "core.roundconfiguration", - "pk": 7 + "model": "core.roundconfiguration", + "pk": 7 +}, +{ + "fields": { + "date_created": "2010-09-07 15:13:03", + "duration": 60, + "experiment_configuration": 1, + "instructions": "Forestry round", + "last_modified": "2010-09-07 15:13:03", + "round_type": "REGULAR", + "display_number": 2, + "sequence_number": 8 }, - { - "fields": { - "date_created": "2010-09-07 15:13:03", - "duration": 60, - "experiment_configuration": 1, - "instructions": "Forestry round", - "last_modified": "2010-09-07 15:13:03", - "round_type": "REGULAR", - "display_number": 2, - "sequence_number": 8 - }, - "model": "core.roundconfiguration", - "pk": 8 + "model": "core.roundconfiguration", + "pk": 8 +}, +{ + "fields": { + "date_created": "2010-09-07 15:13:03", + "duration": 60, + "experiment_configuration": 1, + "instructions": "Chat round.", + "last_modified": "2010-09-07 15:13:03", + "round_type": "CHAT", + "sequence_number": 9 }, - { - "fields": { - "date_created": "2010-09-07 15:13:03", - "duration": 60, - "experiment_configuration": 1, - "instructions": "Chat round.", - "last_modified": "2010-09-07 15:13:03", - "round_type": "CHAT", - "sequence_number": 9 - }, - "model": "core.roundconfiguration", - "pk": 9 + "model": "core.roundconfiguration", + "pk": 9 +}, +{ + "fields": { + "date_created": "2010-09-07 15:13:03", + "duration": 60, + "experiment_configuration": 1, + "instructions": "Forestry round", + "last_modified": "2010-09-07 15:13:03", + "round_type": "REGULAR", + "display_number": 3, + "sequence_number": 10 }, - { - "fields": { - "date_created": "2010-09-07 15:13:03", - "duration": 60, - "experiment_configuration": 1, - "instructions": "Forestry round", - "last_modified": "2010-09-07 15:13:03", - "round_type": "REGULAR", - "display_number": 3, - "sequence_number": 10 - }, - "model": "core.roundconfiguration", - "pk": 10 + "model": "core.roundconfiguration", + "pk": 10 +}, +{ + "fields": { + "name":"harvest_decision", + "experiment_metadata": 1, + "creator": 1, + "type": "int", + "date_created": "2011-01-01 15:13:03", + "last_modified": "2011-01-01 15:13:05", + "scope": "participant" }, - { - "fields": { - "name":"harvest_decision", - "experiment_metadata": 1, - "creator": 1, - "type": "int", - "date_created": "2011-01-01 15:13:03", - "last_modified": "2011-01-01 15:13:05", - "scope": "participant" - }, - "model": "core.parameter", - "pk": 1 + "model": "core.parameter", + "pk": 1 +}, +{ + "fields": { + "name":"resource_level", + "experiment_metadata": 1, + "creator": 1, + "type": "int", + "date_created": "2011-01-01 15:13:07", + "last_modified": "2011-01-01 15:15:05", + "scope": "group" }, - { - "fields": { - "name":"resource_level", - "experiment_metadata": 1, - "creator": 1, - "type": "int", - "date_created": "2011-01-01 15:13:07", - "last_modified": "2011-01-01 15:15:05", - "scope": "group" - }, - "model": "core.parameter", - "pk": 2 + "model": "core.parameter", + "pk": 2 +}, +{ + "fields": { + "name":"reset_resource_level", + "experiment_metadata": 1, + "creator": 1, + "type": "boolean", + "scope": "round", + "date_created": "2011-01-01 15:13:07", + "last_modified": "2011-01-01 15:15:05", + "default_value_string": "true" }, - { - "fields": { - "name":"reset_resource_level", - "experiment_metadata": 1, - "creator": 1, - "type": "boolean", - "scope": "round", - "date_created": "2011-01-01 15:13:07", - "last_modified": "2011-01-01 15:15:05", - "default_value_string": "true" - }, - "model": "core.parameter", - "pk": 3 + "model": "core.parameter", + "pk": 3 +}, +{ + "fields": { + "name":"initial_resource_level", + "experiment_metadata": 1, + "creator": 1, + "type": "int", + "scope": "round", + "date_created": "2011-01-01 15:13:07", + "last_modified": "2011-01-01 15:15:05", + "default_value_string": 100 }, - { - "fields": { - "name":"initial_resource_level", - "experiment_metadata": 1, - "creator": 1, - "type": "int", - "scope": "round", - "date_created": "2011-01-01 15:13:07", - "last_modified": "2011-01-01 15:15:05", - "default_value_string": 100 - }, - "model": "core.parameter", - "pk": 4 + "model": "core.parameter", + "pk": 4 +}, +{ + "pk": 5, + "model": "core.parameter", + "fields": { + "experiment_metadata": 1, + "description": "Number of regrown trees for a given group in a given round.", + "display_name": "Group regrowth", + "name": "group_regrowth", + "creator": 1, + "default_value_string": "", + "date_created": "2011-03-15 17:02:47", + "last_modified": "2011-03-15 17:05:36", + "scope": "group", + "enum_choices": "", + "is_required": false, + "type": "int" + } +}, { + "pk": 6, + "model": "core.parameter", + "fields": { + "experiment_metadata": 1, + "display_name": "Group harvest", + "description": "The number of trees harvested by this group in this round.", + "name": "group_harvest", + "creator": 1, + "default_value_string": "", + "date_created": "2011-03-15 17:04:24", + "last_modified": "2011-03-15 17:04:24", + "scope": "group", + "enum_choices": "", + "is_required": false, + "type": "int" + } +}, +{ + "fields": { + "round_configuration": 2, + "date_created": "2011-03-15 17:04:24", + "last_modified": "2011-03-15 17:04:24", + "parameter": [ "reset_resource_level" ], + "boolean_value": "True" }, - { - "pk": 5, - "model": "core.parameter", - "fields": { - "experiment_metadata": 1, - "description": "Number of regrown trees for a given group in a given round.", - "display_name": "Group regrowth", - "name": "group_regrowth", - "creator": 1, - "default_value_string": "", - "date_created": "2011-03-15 17:02:47", - "last_modified": "2011-03-15 17:05:36", - "scope": "group", - "enum_choices": "", - "is_required": false, - "type": "int" - } - }, { - "pk": 6, - "model": "core.parameter", - "fields": { - "experiment_metadata": 1, - "display_name": "Group harvest", - "description": "The number of trees harvested by this group in this round.", - "name": "group_harvest", - "creator": 1, - "default_value_string": "", - "date_created": "2011-03-15 17:04:24", - "last_modified": "2011-03-15 17:04:24", - "scope": "group", - "enum_choices": "", - "is_required": false, - "type": "int" - } + "model": "core.roundparametervalue", + "pk": 8 +}, +{ + "fields": { + "round_configuration": 2, + "date_created": "2011-03-15 17:04:24", + "last_modified": "2011-03-15 17:04:24", + "parameter": [ "initial_resource_level" ], + "int_value": 100 }, - { - "fields": { - "round_configuration": 2, - "date_created": "2011-03-15 17:04:24", - "last_modified": "2011-03-15 17:04:24", - "parameter": [ "reset_resource_level" ], - "boolean_value": "True" - }, - "model": "core.roundparametervalue", - "pk": 8 + "model": "core.roundparametervalue", + "pk": 9 +}, +{ + "fields": { + "round_configuration": 3, + "date_created": "2011-03-15 17:04:24", + "last_modified": "2011-03-15 17:04:24", + "parameter": [ "reset_resource_level" ], + "boolean_value": "True" }, - { - "fields": { - "round_configuration": 2, - "date_created": "2011-03-15 17:04:24", - "last_modified": "2011-03-15 17:04:24", - "parameter": [ "initial_resource_level" ], - "int_value": 100 - }, - "model": "core.roundparametervalue", - "pk": 9 + "model": "core.roundparametervalue", + "pk": 1 +}, +{ + "fields": { + "round_configuration": 3, + "date_created": "2011-03-15 17:04:24", + "last_modified": "2011-03-15 17:04:24", + "parameter": [ "initial_resource_level" ], + "int_value": 100 }, - { - "fields": { - "round_configuration": 3, - "date_created": "2011-03-15 17:04:24", - "last_modified": "2011-03-15 17:04:24", - "parameter": [ "reset_resource_level" ], - "boolean_value": "True" - }, - "model": "core.roundparametervalue", - "pk": 1 + "model": "core.roundparametervalue", + "pk": 2 +}, +{ + "fields": { + "round_configuration": 5, + "date_created": "2011-03-15 17:04:24", + "last_modified": "2011-03-15 17:04:24", + "parameter": [ "reset_resource_level" ], + "boolean_value": "False" }, - { - "fields": { - "round_configuration": 3, - "date_created": "2011-03-15 17:04:24", - "last_modified": "2011-03-15 17:04:24", - "parameter": [ "initial_resource_level" ], - "int_value": 100 - }, - "model": "core.roundparametervalue", - "pk": 2 - }, - { - "fields": { - "round_configuration": 5, - "date_created": "2011-03-15 17:04:24", - "last_modified": "2011-03-15 17:04:24", - "parameter": [ "reset_resource_level" ], - "boolean_value": "False" - }, - "model": "core.roundparametervalue", - "pk": 3 - } + "model": "core.roundparametervalue", + "pk": 3 +} ] diff -r 8fa20fd5555e006339c56001c4e1090ca152da9d -r 9dc4ddf8ae15c1a828a976bcb8efae5cb4dd7cf7 vcweb/lighterprints/fixtures/lighterprints_experiment_metadata.json --- a/vcweb/lighterprints/fixtures/lighterprints_experiment_metadata.json +++ b/vcweb/lighterprints/fixtures/lighterprints_experiment_metadata.json @@ -15,56 +15,6 @@ } }, { - "pk": 14, - "model": "auth.user", - "fields": { - "username": "sr...@as...", - "first_name": "Steven", - "last_name": "Elias", - "is_active": true, - "is_superuser": false, - "is_staff": true, - "last_login": "2011-07-21 11:26:11", - "groups": [], - "user_permissions": [ - 91, - 92, - 93, - 94, - 95, - 96 - ], - "password": "sha1$b6803$fdf4e561936dcf4d4986ee2820bcb4dbf08501d7", - "email": "sr...@as...", - "date_joined": "2011-07-08 16:23:27" - } - }, - { - "pk": 15, - "model": "auth.user", - "fields": { - "username": "jmh...@as...", - "first_name": "Jenny", - "last_name": "Hastings", - "is_active": true, - "is_superuser": false, - "is_staff": true, - "last_login": "2012-02-17 12:26:12", - "groups": [], - "user_permissions": [ - 91, - 92, - 93, - 94, - 95, - 96 - ], - "password": "sha1$d5aa9$1b81860e131dffc257fd9437788652f19766ad09", - "email": "jmh...@as...", - "date_joined": "2012-02-17 12:26:12" - } - }, - { "fields": { "authentication_code": "TEST_LIGHTERPRINTS", "current_round_sequence_number": 1, @@ -84,6 +34,26 @@ "pk": 4 }, { + "pk": 33, + "model": "core.experiment", + "fields": { + "experiment_metadata": 3, + "status": "INACTIVE", + "tick_duration": "", + "authentication_code": "vcweb.auth.code", + "current_round_start_time": null, + "last_modified": "2013-04-27T00:02:20.965", + "experimenter": 8, + "date_activated": null, + "current_round_sequence_number": 1, + "duration": "", + "date_created": "2013-04-27T00:02:08", + "experiment_configuration": 4, + "current_repeated_round_sequence_number": 0, + "amqp_exchange_name": "vcweb.default.exchange" + } + }, + { "fields": { "creator": 1, "experiment_metadata": [ diff -r 8fa20fd5555e006339c56001c4e1090ca152da9d -r 9dc4ddf8ae15c1a828a976bcb8efae5cb4dd7cf7 vcweb/settings.py --- a/vcweb/settings.py +++ b/vcweb/settings.py @@ -305,7 +305,6 @@ import settings_local as local_settings has_local_settings = True except ImportError: - print "no local settings found. create settings_local.py to override settings in a hg-ignored file" has_local_settings = False def add_settings_tuples(varname, local_settings): @@ -329,7 +328,7 @@ print "error: %s" % e pass # for django-debug-toolbar -INTERNAL_IPS = ('127.0.0.1','68.99.87.185',) +INTERNAL_IPS = ('127.0.0.1',) DEBUG_TOOLBAR_CONFIG = { 'INTERCEPT_REDIRECTS': False, } 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. |
From: <com...@bi...> - 2013-04-26 18:40:10
|
1 new commit in vcweb: https://bitbucket.org/virtualcommons/vcweb/commits/d0e48e73a1b9/ Changeset: d0e48e73a1b9 User: alllee Date: 2013-04-26 20:39:56 Summary: removing defunct field name in initial data fixture for the broker experiment Affected #: 1 file diff -r 7447523911a35f3c026730beebb8432b2ea7899e -r d0e48e73a1b985b8ebf1d73a7dbbcad871b896d8 vcweb/broker/fixtures/broker_experiment_metadata.json --- a/vcweb/broker/fixtures/broker_experiment_metadata.json +++ b/vcweb/broker/fixtures/broker_experiment_metadata.json @@ -85,7 +85,6 @@ "model": "core.roundconfiguration", "fields": { "round_type": "PRACTICE", - "template_name": "", "debriefing": "", "survey_url": "", "duration": 0, 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. |
From: <com...@bi...> - 2013-04-24 00:36:30
|
1 new commit in vcweb: https://bitbucket.org/virtualcommons/vcweb/commits/7447523911a3/ Changeset: 7447523911a3 User: alllee Date: 2013-04-24 02:36:23 Summary: more pruning unnecessary data from json messages Affected #: 4 files diff -r c83b09da4b5ab40d5c6bd9ee2d45d19c9786a780 -r 7447523911a35f3c026730beebb8432b2ea7899e vcweb/bound/templates/bound/participate.html --- a/vcweb/bound/templates/bound/participate.html +++ b/vcweb/bound/templates/bound/participate.html @@ -67,7 +67,7 @@ </div><ul class='pager'><li class='next'> - <a href='javascript: void()' data-bind='click: participantReady.bind($data, participantHandle() + " finished reading session summary.") '>Ok, I'm ready</a> + <a href='javascript: void()' data-bind='click: participantReady.bind($data, participantGroupId() + " finished reading session summary.") '>Ok, I'm ready</a></li></ul></script> @@ -118,7 +118,7 @@ <a href='javascript: void()' data-bind='click: activateTemplate.bind($data, "PRACTICE_ROUND_RESULTS")'>Back</a></li><li class='next'> - <a href='javascript: void()' data-bind='click: participantReady.bind($data, participantHandle() + " finished paid experiment instructions") '>Ok, I understand</a> + <a href='javascript: void()' data-bind='click: participantReady.bind($data, participantGroupId() + " finished paid experiment instructions") '>Ok, I understand</a></li></ul></script> @@ -158,7 +158,7 @@ </ul><ul class='pager'><li class='next'> - <a href='javascript: void()' data-bind='click: participantReady.bind($data, participantHandle() + " finished treatment A instructions")'>Ok, I am ready to start</a> + <a href='javascript: void()' data-bind='click: participantReady.bind($data, participantGroupId() + " finished treatment A instructions")'>Ok, I am ready to start</a></li></ul></script> @@ -175,7 +175,7 @@ </ul><ul class='pager'><li class='next'> - <a href='javascript: void()' data-bind='click: participantReady.bind($data, participantHandle() + " finished treatment D instructions")'>Ok, I am ready to start</a> + <a href='javascript: void()' data-bind='click: participantReady.bind($data, participantGroupId() + " finished treatment D instructions")'>Ok, I am ready to start</a></li></ul></script> @@ -326,7 +326,7 @@ <a href='javascript:void();' data-bind='click: activateTemplate.bind($data, "GENERAL_INSTRUCTIONS3")'>Back</a></li><li class='next'> -<a href='javascript: void();' data-bind='click: participantReady.bind($data, participantHandle() + " finished practice round instructions")'>I have fully read and understand these instructions</a> +<a href='javascript: void();' data-bind='click: participantReady.bind($data, participantGroupId() + " finished practice round instructions")'>I have fully read and understand these instructions</a></li></ul></script> diff -r c83b09da4b5ab40d5c6bd9ee2d45d19c9786a780 -r 7447523911a35f3c026730beebb8432b2ea7899e vcweb/bound/views.py --- a/vcweb/bound/views.py +++ b/vcweb/bound/views.py @@ -133,7 +133,6 @@ # participant data experiment_model_dict['participantNumber'] = participant_group_relationship.participant_number experiment_model_dict['participantGroupId'] = participant_group_relationship.pk - experiment_model_dict['participantHandle'] = participant_group_relationship.participant_handle # FIXME: these should only need to be added for playable rounds but KO gets unhappy when we switch templates from # instructions rounds to practice rounds. own_group = participant_group_relationship.group diff -r c83b09da4b5ab40d5c6bd9ee2d45d19c9786a780 -r 7447523911a35f3c026730beebb8432b2ea7899e vcweb/core/models.py --- a/vcweb/core/models.py +++ b/vcweb/core/models.py @@ -2011,7 +2011,6 @@ data.update( group_id=group.pk, group=unicode(group), - participant_handle=pgr.participant_handle, participant_number=pgr.participant_number, event_type='chat', ) diff -r c83b09da4b5ab40d5c6bd9ee2d45d19c9786a780 -r 7447523911a35f3c026730beebb8432b2ea7899e vcweb/core/templates/experimenter/monitor.html --- a/vcweb/core/templates/experimenter/monitor.html +++ b/vcweb/core/templates/experimenter/monitor.html @@ -88,7 +88,7 @@ {% for item in group.list %} <tr><td>{{ item.participant_group_relationship.pk }}</td> - <td>{{ item.participant_group_relationship.participant_handle}}</td> + <td>{{ item.participant_group_relationship.participant_number}}</td><td>{{ item.participant_group_relationship.participant.email }}</td></tr> {% endfor %} @@ -142,7 +142,7 @@ <div id='experiment-chat-messages' class='scrollable-messages accordion-body collapse'><div class='alert' data-bind='foreach: chatMessages'><div> - <span data-bind='text: participant_handle'></span>(<span data-bind='text: group'></span>): <strong data-bind='text: value'></strong> + <span data-bind='text: participant_number'></span>(<span data-bind='text: group'></span>): <strong data-bind='text: value'></strong><span class='pull-right' data-bind='text: short_date_created'></span></div></div> 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. |
From: <com...@bi...> - 2013-04-24 00:15:40
|
1 new commit in vcweb: https://bitbucket.org/virtualcommons/vcweb/commits/c83b09da4b5a/ Changeset: c83b09da4b5a User: alllee Date: 2013-04-24 02:12:54 Summary: removing ChatMessage.message from json dict as it's already present in .value Affected #: 5 files diff -r ada9963bcedf36160be60044fad4e846945b4869 -r c83b09da4b5ab40d5c6bd9ee2d45d19c9786a780 vcweb/bound/templates/bound/participate.html --- a/vcweb/bound/templates/bound/participate.html +++ b/vcweb/bound/templates/bound/participate.html @@ -39,7 +39,7 @@ <div id='chat-div'><div class='chat-messages' data-bind='foreach: chatMessages'><i class='icon-user muted'></i><strong data-bind='text: participant_number'></strong> - <small><i class='icon-double-angle-right'></i></small><span data-bind='text: message'></span> + <small><i class='icon-double-angle-right'></i></small><span data-bind='text: value'></span><br></div></div> diff -r ada9963bcedf36160be60044fad4e846945b4869 -r c83b09da4b5ab40d5c6bd9ee2d45d19c9786a780 vcweb/core/models.py --- a/vcweb/core/models.py +++ b/vcweb/core/models.py @@ -2009,7 +2009,6 @@ pgr = self.participant_group_relationship group = self.participant_group_relationship.group data.update( - message=self.message, group_id=group.pk, group=unicode(group), participant_handle=pgr.participant_handle, diff -r ada9963bcedf36160be60044fad4e846945b4869 -r c83b09da4b5ab40d5c6bd9ee2d45d19c9786a780 vcweb/core/templates/experimenter/monitor.html --- a/vcweb/core/templates/experimenter/monitor.html +++ b/vcweb/core/templates/experimenter/monitor.html @@ -142,7 +142,7 @@ <div id='experiment-chat-messages' class='scrollable-messages accordion-body collapse'><div class='alert' data-bind='foreach: chatMessages'><div> - <span data-bind='text: participant_handle'></span>(<span data-bind='text: group'></span>): <strong data-bind='text: message'></strong> + <span data-bind='text: participant_handle'></span>(<span data-bind='text: group'></span>): <strong data-bind='text: value'></strong><span class='pull-right' data-bind='text: short_date_created'></span></div></div> diff -r ada9963bcedf36160be60044fad4e846945b4869 -r c83b09da4b5ab40d5c6bd9ee2d45d19c9786a780 vcweb/core/templates/forms/chat.html --- a/vcweb/core/templates/forms/chat.html +++ b/vcweb/core/templates/forms/chat.html @@ -51,7 +51,7 @@ } var chatMessagesViewModel = new ChatMessagesViewModel(); {% for chat_message in chat_messages %} - chatMessagesViewModel.addMessage({ message: {{chat_message.message}}, date_created: {{chat_message.date_created}}, sender: {{chat_message.sender}} }); + chatMessagesViewModel.addMessage({ message: {{chat_message.value}}, date_created: {{chat_message.date_created}}, sender: {{chat_message.sender}} }); {% endfor %} ko.applyBindings(chatMessagesViewModel); var s = connect('/participant'); diff -r ada9963bcedf36160be60044fad4e846945b4869 -r c83b09da4b5ab40d5c6bd9ee2d45d19c9786a780 vcweb/lighterprints/templates/lighterprints/participate.html --- a/vcweb/lighterprints/templates/lighterprints/participate.html +++ b/vcweb/lighterprints/templates/lighterprints/participate.html @@ -218,7 +218,7 @@ <div class='span6'><strong>Participant <span data-bind='text: participant_number'></span></strong><p> - <span data-bind='text: message'></span> + <span data-bind='text: value'></span></p></div><div class='span1'> 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. |
From: <com...@bi...> - 2013-04-23 20:58:32
|
1 new commit in vcweb: https://bitbucket.org/virtualcommons/vcweb/commits/ada9963bcedf/ Changeset: ada9963bcedf User: alllee Date: 2013-04-23 22:58:19 Summary: fixing hopefully last grid column issue in observe other group condition, removing dead code from ko model Affected #: 2 files diff -r 83476e12cf43caf7be3f7eb2a827272400b05d19 -r ada9963bcedf36160be60044fad4e846945b4869 vcweb/bound/models.py --- a/vcweb/bound/models.py +++ b/vcweb/bound/models.py @@ -425,5 +425,6 @@ def calculate_regrowth(resource_level, regrowth_rate, max_resource_level): if resource_level == max_resource_level: return 0 + logger.debug("calculating regrowth: (%s * %s) * (1 - (%s / %s))", regrowth_rate, resource_level, resource_level, max_resource_level) return (regrowth_rate * resource_level) * (1 - (resource_level / float(max_resource_level))) diff -r 83476e12cf43caf7be3f7eb2a827272400b05d19 -r ada9963bcedf36160be60044fad4e846945b4869 vcweb/bound/templates/bound/participate.html --- a/vcweb/bound/templates/bound/participate.html +++ b/vcweb/bound/templates/bound/participate.html @@ -397,7 +397,7 @@ </div></div><div class='row'> - <div class='span8' data-bind='template: { name: "resource-visualization-template" }'></div> + <div data-bind='css: { span8: ! canObserveOtherGroup() }, template: { name: "resource-visualization-template" }'></div></div><div class='row' data-bind='ifnot: isResourceEmpty()'><div class='span8'> @@ -475,6 +475,7 @@ {% comment %} FIXME: crummy use of "px" concatenation, use something like inPixels(..) instead? {% endcomment %} <div data-bind='style: { width: remainderResourceImageWidth(otherGroupResourceLevel), height: resourceImageHeight() + "px", background: resourceImageBackgroundUrl }'></div></div> + <br><table class='table table-bordered table-condensed table-striped'><tbody><tr><td>forest</td><td data-bind='text:otherGroupResourceLevel()'></td></tr> @@ -598,10 +599,6 @@ model.activateTemplate("WAITING_ROOM"); }); } - model.showOtherGroup = function() { - model.shouldShowOtherGroup(true); - } - model.shouldShowOtherGroup = ko.observable(false); model.numberOfTreesPerRow = ko.observable(10); model.isResourceEmpty = ko.computed(function() { return model.resourceLevel() == 0; @@ -643,20 +640,20 @@ return (remainder * model.resourceImageWidth()) + "px"; }; model.startRound = function() { - // reset other group view - model.shouldShowOtherGroup(false); if (model.showTour()) { model.setupTour(); } console.debug("starting round"); if (isInt(model.timeRemaining()) && model.timeRemaining() > 0) { - model.setupChat(); model.secondsLeft(model.timeRemaining()); model.setCurrentInterval( setInterval(function() { model.tick(); if (! model.isTimerRunning()) { - model.submitDecision(); + if (! model.submitted()) { + // don't auto-submit decisions if we have already submit one + model.submitDecision(); + } model.clearCurrentInterval(); } }, @@ -726,6 +723,8 @@ model.setFormDisabled("#chat-form", true); } model.setupChat = function() { + // FIXME: chat is disabled in practice rounds, when it's explicitly disabled, or if the participant is + // no longer alive var chatDisabled = model.isPracticeRound() || ! model.chatEnabled() || ! model.alive(); model.setFormDisabled("#chat-form", chatDisabled); model.chatEnabled(! chatDisabled); 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. |
From: <com...@bi...> - 2013-04-23 03:39:40
|
1 new commit in vcweb: https://bitbucket.org/virtualcommons/vcweb/commits/83476e12cf43/ Changeset: 83476e12cf43 User: alllee Date: 2013-04-23 05:39:28 Summary: fixing grid column layout for group and resource visualization, needed to explicitly set row>span8 classes on the containers. Affected #: 1 file diff -r 01b904410a05051b0e44f229ed1a1889c9a12a81 -r 83476e12cf43caf7be3f7eb2a827272400b05d19 vcweb/bound/templates/bound/participate.html --- a/vcweb/bound/templates/bound/participate.html +++ b/vcweb/bound/templates/bound/participate.html @@ -396,31 +396,35 @@ </table></div></div> -<div class='row' data-bind='template: { name: "resource-visualization-template" }'></div> +<div class='row'> + <div class='span8' data-bind='template: { name: "resource-visualization-template" }'></div> +</div><div class='row' data-bind='ifnot: isResourceEmpty()'> -<h3>Harvest</h3> -<div data-bind='if: submitted'> - <div class='alert alert-success'> - <i class='icon-leaf'></i> You have submitted a harvest decision for <span class='badge badge-info' - data-bind='text: harvestDecision'></span> trees. Please wait quietly while the rest of the participants submit - their decisions. + <div class='span8'> + <h3>Harvest</h3> + <div data-bind='if: submitted'> + <div class='alert alert-success'> + <i class='icon-leaf'></i> You have submitted a harvest decision for <span class='badge badge-info' + data-bind='text: harvestDecision'></span> trees. Please wait quietly while the rest of the participants submit + their decisions. + </div> + </div> + <div data-bind='ifnot: alive'> + <div class='alert alert-error'> + <b><i class='icon-ambulance'></i></b> You didn't harvest enough trees to meet the cost of living and are now + <b>deceased</b>. You will not be able to chat or submit harvest decisions until this session is over. + </div> + </div> + <div data-bind='ifnot: isResourceEmpty'> + <form id='vcweb-form' method='post' class='form-horizontal' > + {% csrf_token %} + <div id='harvestDecisionDiv' class='control-group'> + <div data-bind='template: { name: "harvest-decision-click-template" }'></div> + </div> + </form> + </div></div></div> -<div data-bind='ifnot: alive'> - <div class='alert alert-error'> - <b><i class='icon-ambulance'></i></b> You didn't harvest enough trees to meet the cost of living and are now - <b>deceased</b>. You will not be able to chat or submit harvest decisions until this session is over. - </div> -</div> -<div data-bind='ifnot: isResourceEmpty'> - <form id='vcweb-form' method='post' class='form-horizontal' > - {% csrf_token %} - <div id='harvestDecisionDiv' class='control-group'> - <div data-bind='template: { name: "harvest-decision-click-template" }'></div> - </div> - </form> -</div> -</div></script><script type='text/html' id='resource-visualization-template'><div data-bind='if: isPracticeRound'> @@ -430,7 +434,7 @@ </div></div> -<div data-bind='css: { "span4": canObserveOtherGroup }'> +<div data-bind='css: { span4: canObserveOtherGroup }'><h4>My Group</h4><div class='alert alert-message'><strong class='badge badge-success' data-bind='text:resourceLevel'></strong> trees</div><div data-bind="visible: isResourceEmpty"> @@ -445,6 +449,7 @@ {% comment %} FIXME: crummy use of "px" concatenation, use something like inPixels(..) instead? {% endcomment %} <div data-bind='style: { width: remainderResourceImageWidth(resourceLevel), height: resourceImageHeight() + "px", background: resourceImageBackgroundUrl }'></div></div> +<br><table class='table table-bordered table-condensed table-striped'><tbody><tr><td>forest</td><td data-bind='text:resourceLevel'></td></tr> @@ -455,28 +460,30 @@ </table></div> -<div data-bind='if: canObserveOtherGroup' class='span4'> -<h4>Other Group</h4> -<div class='alert alert-message'><strong class='badge badge-success' data-bind='text:otherGroupResourceLevel'></strong> trees</div> -<div data-bind="visible: isResourceEmpty"> - <div class='well'> - <center><img alt='deforested' src="{% static 'images/forestry/deforestation.jpg' %}" class="img-polaroid" width="425" height="282"></center> +<div data-bind='if: canObserveOtherGroup'> + <div class='span4'> + <h4>Other Group</h4> + <div class='alert alert-message'><strong class='badge badge-success' data-bind='text:otherGroupResourceLevel'></strong> trees</div> + <div data-bind="visible: isResourceEmpty"> + <div class='well'> + <center><img alt='deforested' src="{% static 'images/forestry/deforestation.jpg' %}" class="img-polaroid" width="425" height="282"></center> + </div> + <div class='alert alert-error'><i class='icon-warning-sign'></i> There are no more trees to harvest.</div> + </div> + <div data-bind='ifnot: isResourceEmpty'> + <div data-bind='style: { width: blockResourceVisualizationImageWidth(otherGroupResourceLevel), height: blockResourceVisualizationImageHeight(otherGroupResourceLevel), background: resourceImageBackgroundUrl }'></div> + {% comment %} FIXME: crummy use of "px" concatenation, use something like inPixels(..) instead? {% endcomment %} + <div data-bind='style: { width: remainderResourceImageWidth(otherGroupResourceLevel), height: resourceImageHeight() + "px", background: resourceImageBackgroundUrl }'></div> + </div> + <table class='table table-bordered table-condensed table-striped'> + <tbody> + <tr><td>forest</td><td data-bind='text:otherGroupResourceLevel()'></td></tr> + <tr><td>average harvest</td><td data-bind='text:otherGroupAverageHarvest().toFixed(1)'></td></tr> + <tr><td>average earnings</td><td data-bind='text:otherGroupAverageStorage().toFixed(1)'></td></tr> + <tr><td>number alive</td><td data-bind='text:otherGroupNumberAlive'></td></tr> + </tbody> + </table></div> - <div class='alert alert-error'><i class='icon-warning-sign'></i> There are no more trees to harvest.</div> -</div> -<div data-bind='ifnot: isResourceEmpty'> -<div data-bind='style: { width: blockResourceVisualizationImageWidth(otherGroupResourceLevel), height: blockResourceVisualizationImageHeight(otherGroupResourceLevel), background: resourceImageBackgroundUrl }'></div> -{% comment %} FIXME: crummy use of "px" concatenation, use something like inPixels(..) instead? {% endcomment %} -<div data-bind='style: { width: remainderResourceImageWidth(otherGroupResourceLevel), height: resourceImageHeight() + "px", background: resourceImageBackgroundUrl }'></div> -</div> -<table class='table table-bordered table-condensed table-striped'> - <tbody> - <tr><td>forest</td><td data-bind='text:otherGroupResourceLevel()'></td></tr> - <tr><td>average harvest</td><td data-bind='text:otherGroupAverageHarvest().toFixed(1)'></td></tr> - <tr><td>average earnings</td><td data-bind='text:otherGroupAverageStorage().toFixed(1)'></td></tr> - <tr><td>number alive</td><td data-bind='text:otherGroupNumberAlive'></td></tr> - </tbody> -</table></div></script><script type='text/html' id='harvest-decision-click-template'> @@ -604,7 +611,7 @@ return 37; } else { - return 80; + return 77; } }); model.resourceImageWidth = ko.observable(10); 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. |
From: <com...@bi...> - 2013-04-23 00:20:16
|
1 new commit in vcweb: https://bitbucket.org/virtualcommons/vcweb/commits/01b904410a05/ Changeset: 01b904410a05 User: alllee Date: 2013-04-23 02:19:26 Summary: more work on grid layout, still need to fix rows below the My Status / Group Status dashboard Affected #: 1 file diff -r bd2fe9f7438b4843ade06af3a657f34255942121 -r 01b904410a05051b0e44f229ed1a1889c9a12a81 vcweb/bound/templates/bound/participate.html --- a/vcweb/bound/templates/bound/participate.html +++ b/vcweb/bound/templates/bound/participate.html @@ -397,7 +397,7 @@ </div></div><div class='row' data-bind='template: { name: "resource-visualization-template" }'></div> -<div data-bind='visible: ! isResourceEmpty()'> +<div class='row' data-bind='ifnot: isResourceEmpty()'><h3>Harvest</h3><div data-bind='if: submitted'><div class='alert alert-success'> @@ -454,6 +454,7 @@ </tbody></table></div> + <div data-bind='if: canObserveOtherGroup' class='span4'><h4>Other Group</h4><div class='alert alert-message'><strong class='badge badge-success' data-bind='text:otherGroupResourceLevel'></strong> trees</div> @@ -477,7 +478,6 @@ </tbody></table></div> -</div></script><script type='text/html' id='harvest-decision-click-template'><table class='table'> 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. |
From: <com...@bi...> - 2013-04-23 00:10:51
|
1 new commit in vcweb: https://bitbucket.org/virtualcommons/vcweb/commits/bd2fe9f7438b/ Changeset: bd2fe9f7438b User: alllee Date: 2013-04-23 02:10:43 Summary: unclosed div tag Affected #: 1 file diff -r 3a6fddcdc24ae6f48da7c6090697a10c11877da1 -r bd2fe9f7438b4843ade06af3a657f34255942121 vcweb/bound/templates/bound/participate.html --- a/vcweb/bound/templates/bound/participate.html +++ b/vcweb/bound/templates/bound/participate.html @@ -477,6 +477,7 @@ </tbody></table></div> +</div></script><script type='text/html' id='harvest-decision-click-template'><table class='table'> 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. |
From: <com...@bi...> - 2013-04-22 23:59:51
|
1 new commit in vcweb: https://bitbucket.org/virtualcommons/vcweb/commits/3a6fddcdc24a/ Changeset: 3a6fddcdc24a User: alllee Date: 2013-04-23 01:58:37 Summary: more refinement of harvest decision UI using active/hover/selected CSS. spacing needs additional refinement Affected #: 8 files diff -r 4a98b2a3061967787df85d09ec201e25e5878f2c -r 3a6fddcdc24ae6f48da7c6090697a10c11877da1 vcweb/bound/static/css/bound/style.css --- a/vcweb/bound/static/css/bound/style.css +++ b/vcweb/bound/static/css/bound/style.css @@ -26,19 +26,36 @@ margin-right: 0px; padding: 8px 8px 8px 8px; } -.harvest-decision-resources td { - cursor: pointer; +.zero-harvest-decision { + margin: 0 0 0 -5px; + width: 40px; + height: 40px; + background: url('/static/images/bound/zero-trees-inactive.png'); +} +.zero-harvest-decision.selected { + background: url('/static/images/bound/zero-trees-active.png') !important; +} +.zero-harvest-decision:hover { + background: url('/static/images/bound/zero-trees-hover.png'); } .harvest-decision-tree { + padding: 0 0 0 0; + margin: 0 0 0 -5px; + width: 40px; + height: 40px; + background: url('/static/images/bound/tree-inactive.png'); +} +.harvest-decision-tree.selected { + background: url('/static/images/bound/tree-active.png') !important; +} +.harvest-decision-tree:hover { + background: url('/static/images/bound/tree-hover.png'); +} +.harvest-decision-tree-div { + cursor: pointer; padding: 3px 3px 3px 8px; margin: 5px 5px 5px 5px; } -.harvest-decision-tree:hover { - border: 1px solid #ddd; - border-radius: 4px; - -webkit-border-radius: 4px; - background-color: #dff0d8; -} col.current-player { background-color: #ffb914; } diff -r 4a98b2a3061967787df85d09ec201e25e5878f2c -r 3a6fddcdc24ae6f48da7c6090697a10c11877da1 vcweb/bound/static/images/bound/tree-active.png Binary file vcweb/bound/static/images/bound/tree-active.png has changed diff -r 4a98b2a3061967787df85d09ec201e25e5878f2c -r 3a6fddcdc24ae6f48da7c6090697a10c11877da1 vcweb/bound/static/images/bound/tree-hover.png Binary file vcweb/bound/static/images/bound/tree-hover.png has changed diff -r 4a98b2a3061967787df85d09ec201e25e5878f2c -r 3a6fddcdc24ae6f48da7c6090697a10c11877da1 vcweb/bound/static/images/bound/tree-inactive.png Binary file vcweb/bound/static/images/bound/tree-inactive.png has changed diff -r 4a98b2a3061967787df85d09ec201e25e5878f2c -r 3a6fddcdc24ae6f48da7c6090697a10c11877da1 vcweb/bound/static/images/bound/zero-trees-active.png Binary file vcweb/bound/static/images/bound/zero-trees-active.png has changed diff -r 4a98b2a3061967787df85d09ec201e25e5878f2c -r 3a6fddcdc24ae6f48da7c6090697a10c11877da1 vcweb/bound/static/images/bound/zero-trees-hover.png Binary file vcweb/bound/static/images/bound/zero-trees-hover.png has changed diff -r 4a98b2a3061967787df85d09ec201e25e5878f2c -r 3a6fddcdc24ae6f48da7c6090697a10c11877da1 vcweb/bound/static/images/bound/zero-trees-inactive.png Binary file vcweb/bound/static/images/bound/zero-trees-inactive.png has changed diff -r 4a98b2a3061967787df85d09ec201e25e5878f2c -r 3a6fddcdc24ae6f48da7c6090697a10c11877da1 vcweb/bound/templates/bound/participate.html --- a/vcweb/bound/templates/bound/participate.html +++ b/vcweb/bound/templates/bound/participate.html @@ -413,10 +413,10 @@ </div></div><div data-bind='ifnot: isResourceEmpty'> - <form id='vcweb-form' data-bind='submit: submitDecision' action='' method='post' class='form-horizontal' > + <form id='vcweb-form' method='post' class='form-horizontal' > {% csrf_token %} - <div id='harvestDecisionDiv' data-bind='visible: !submitted()' class='control-group'> - <div data-bind='template: { name: "harvest-decision-multi-select-template" }'></div> + <div id='harvestDecisionDiv' class='control-group'> + <div data-bind='template: { name: "harvest-decision-click-template" }'></div></div></form></div> @@ -478,16 +478,16 @@ </table></div></script> -<script type='text/html' id='harvest-decision-multi-select-template'> +<script type='text/html' id='harvest-decision-click-template'><table class='table'><tr class='row harvest-decision-resources' data-bind='foreach: harvestDecisionOptions'><td data-bind='attr: { id: "harvest-decision-td-" + $data }'> - <form data-bind='attr: { id: "multi-select-decision-form" + $data }'> + <form data-bind='attr: { id: "harvest-decision-click-form" + $data }'><input id='participantGroupId' type='hidden' name='participant_group_id' data-bind='value: $root.participantGroupId'/><input id='harvestDecisionTextInput' type='hidden' name='integer_decision' data-bind='value: $data'> - <div class='harvest-decision-tree' data-bind='click: $root.submitDecision.bind($data, "#multi-select-decision-form" + $data)'> - <img width="40" height="40" data-bind='attr: { src: $root.resourceImageUrl(), alt: "Harvest " + $data + " tree(s)." }'><br> - <span style='margin-left: 2px;' class='badge badge-success' data-bind='text: $data'></span> + <div class='harvest-decision-tree-div' data-bind='click: $root.submitDecision.bind($data, "#harvest-decision-click-form" + $data)'> + <div data-bind='css: { selected: $root.isSelectedHarvestDecision($data), "harvest-decision-tree": $data > 0, "zero-harvest-decision": $data === 0}'></div> + <span style='margin-left: 2px;' class='badge badge-info' data-bind='text: $data'></span></div></form></td> @@ -511,7 +511,11 @@ var self = this; var model = ko.mapping.fromJS(experimentModelJson); model.harvestDecisionOptions = ko.computed(function() { - return ko.utils.range(0, model.maxHarvestDecision()); + var lowerBound = 0; + if (model.submitted()) { + lowerBound = 1; + } + return ko.utils.range(lowerBound, model.maxHarvestDecision()); }); model.calculateEarnings = function(quantity) { return function() { @@ -616,7 +620,7 @@ } return 0; }); - model.resourceImageUrl = ko.observable("{{STATIC_URL}}images/bound/tree-inactive.png"); + model.inactiveResourceImageUrl = ko.observable("{{STATIC_URL}}images/bound/tree-inactive.png"); model.resourceImageBackgroundUrl = ko.observable("url('{{STATIC_URL}}images/bound/tree-resource.png')"); model.blockResourceVisualizationImageWidth = function(resourceLevel) { return (model.resourcesPerRow() * model.resourceImageWidth()) + "px"; @@ -636,12 +640,6 @@ if (model.showTour()) { model.setupTour(); } - if (model.submitted() || ! model.alive()) { - model.disableHarvestForm(); - model.disableChatForm(); - return; - } - model.enableHarvestForm(); console.debug("starting round"); if (isInt(model.timeRemaining()) && model.timeRemaining() > 0) { model.setupChat(); @@ -657,7 +655,14 @@ 1000)); } }; + model.isSelectedHarvestDecision = function(numberOfTrees) { + return model.submitted() && model.harvestDecision() >= numberOfTrees; + } model.submitDecision = function(formId, numberOfTrees) { + if (model.submitted()) { + alert("Should we allow multiple submission? Right now it is disabled."); + return false; + } formId = formId || "#vcweb-form"; numberOfTrees = numberOfTrees || 0; console.debug("formId: " + formId + " -- number of trees: " + numberOfTrees); 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. |
From: <com...@bi...> - 2013-04-22 22:17:38
|
1 new commit in vcweb: https://bitbucket.org/virtualcommons/vcweb/commits/4a98b2a30619/ Changeset: 4a98b2a30619 User: alllee Date: 2013-04-23 00:17:26 Summary: adding resource visualization for peer group observation condition Affected #: 7 files diff -r 92a35d99eafc44b4adbbf9a2727535b73307d1ce -r 4a98b2a3061967787df85d09ec201e25e5878f2c vcweb/bound/models.py --- a/vcweb/bound/models.py +++ b/vcweb/bound/models.py @@ -191,9 +191,12 @@ return participant_group_relationship.get_data_value(parameter=get_player_status_parameter(), round_data=round_data, default=default) -def get_player_status(participant_group_relationship, round_data, default=True): +def is_player_alive(participant_group_relationship, round_data, default=True): return get_player_status_dv(participant_group_relationship, round_data, default).boolean_value +def get_number_alive(group, round_data): + return ParticipantRoundDataValue.objects.for_group(group, parameter=get_player_status_parameter(), round_data=round_data, boolean_value=True).count() + def set_player_status(participant_group_relationship, round_data, value): status_dv = get_player_status_dv(participant_group_relationship, round_data) status_dv.boolean_value = value diff -r 92a35d99eafc44b4adbbf9a2727535b73307d1ce -r 4a98b2a3061967787df85d09ec201e25e5878f2c vcweb/bound/static/css/bound/style.css --- a/vcweb/bound/static/css/bound/style.css +++ b/vcweb/bound/static/css/bound/style.css @@ -22,7 +22,7 @@ } .bound-status-dashboard { height: 100px; - width: 110px; + width: 115px; margin-right: 0px; padding: 8px 8px 8px 8px; } @@ -40,9 +40,11 @@ background-color: #dff0d8; } col.current-player { - background-color: #dff0d8; + background-color: #ffb914; } .current-player { font-weight: bold; - font-size: 1em; + color: #145bff !important; } +.group-status { +} diff -r 92a35d99eafc44b4adbbf9a2727535b73307d1ce -r 4a98b2a3061967787df85d09ec201e25e5878f2c vcweb/bound/static/images/bound/observe.png Binary file vcweb/bound/static/images/bound/observe.png has changed diff -r 92a35d99eafc44b4adbbf9a2727535b73307d1ce -r 4a98b2a3061967787df85d09ec201e25e5878f2c vcweb/bound/static/images/bound/tree-resource.png Binary file vcweb/bound/static/images/bound/tree-resource.png has changed diff -r 92a35d99eafc44b4adbbf9a2727535b73307d1ce -r 4a98b2a3061967787df85d09ec201e25e5878f2c vcweb/bound/templates/bound/participate.html --- a/vcweb/bound/templates/bound/participate.html +++ b/vcweb/bound/templates/bound/participate.html @@ -4,46 +4,50 @@ {{ block.super }} <link rel='stylesheet' href='{% static "css/bound/style.css" %}'/> {% endblock %} -{% block content %} -<h3><span data-bind='text: roundSequenceLabel'></span></h3> -<div data-bind='template: { name: templateId(), afterRender: afterRenderTemplate }'> -</div> -<div id='progress-modal' class='modal hide fade'> - <div class='model-header'> - <h3>Updating experiment data</h3> +{% block page %} +<div class='row' id='page'> + <div id='content' class='span8'> + <h3><span data-bind='text: roundSequenceLabel'></span></h3> + <div data-bind='template: { name: templateId(), afterRender: afterRenderTemplate }'> + </div> + <div id='progress-modal' class='modal hide fade'> + <div class='model-header'> + <h3>Updating experiment data</h3> + </div> + <div class='modal-body'> + <div class='progress progress-striped active'> + <div id='progress-bar' class='bar' style='width: 100%'></div> + </div> + </div> + </div></div> - <div class='modal-body'> - <div class='progress progress-striped active'> - <div id='progress-bar' class='bar' style='width: 100%'></div> + <div id='sidebar' class='span4 filler sidebar'> + <div data-bind='ifnot: isInstructionsRound'> + <h3>Chat</h3> + <div data-bind='ifnot: chatEnabled'> + <div class='alert alert-error'> + <i class='icon-warning-sign'></i> Chat is currently disabled. + </div> + </div> + <form id="chat-form" class='form-inline' data-bind='submit: submitChatMessage' > + <div class='input-prepend input-block-level'> + <span class='add-on'><i class='text-info icon-comment'></i></span> + <input id='chatMessage' type="text" placeholder="Chat with your group"> + </div> + </form> + <div class='chat-sidebar'> + <div id='chat-div'> + <div class='chat-messages' data-bind='foreach: chatMessages'> + <i class='icon-user muted'></i><strong data-bind='text: participant_number'></strong> + <small><i class='icon-double-angle-right'></i></small><span data-bind='text: message'></span> + <br> + </div> + </div> + </div></div></div></div> -{% endblock content %} -{% block sidebar %} -<div data-bind='ifnot: isInstructionsRound'> -<h3>Chat</h3> -<div data-bind='ifnot: chatEnabled'> - <div class='alert alert-error'> - <i class='icon-warning-sign'></i> Chat is currently disabled. - </div> -</div> -<form id="chat-form" class='form-inline' data-bind='submit: submitChatMessage' > - <div class='input-prepend input-block-level'> - <span class='add-on'><i class='text-info icon-comment'></i></span> - <input id='chatMessage' type="text" placeholder="Chat with your group"> - </div> -</form> -<div class='chat-sidebar'> - <div id='chat-div'> - <div class='chat-messages' data-bind='foreach: chatMessages'> - <i class='icon-user muted'></i><strong data-bind='text: participant_number'></strong> - <small><i class='icon-double-angle-right'></i></small><span data-bind='text: message'></span> - <br> - </div> - </div> -</div> -</div> -{% endblock sidebar %} +{% endblock page %} {% block javascript %} {{ block.super }} <!-- ko templates --> @@ -331,14 +335,14 @@ <div class='span5'><h3>My Status</h3><div class='row'> - <div class='alert bound-status-dashboard span2'> - <h4 id="dashboard-last-harvest">Last harvest <i class='icon-info-sign' data-content="The number of trees you harvested last round."></i></h4> + <div class='alert bound-status-dashboard span1'> + <h4 id="dashboard-last-harvest">Last Harvest <i class='icon-info-sign' data-content="The number of trees you harvested last round."></i></h4><p><strong class='text-success'><span data-bind='text:lastHarvestDecision'></span><i class='icon-leaf'></i></strong></p></div> - <div class='alert bound-status-dashboard span2'> - <h4 id='dashboard-storage'>Storage <i class='icon-info-sign' data-bind='attr: {"data-content": "You need at least " + costOfLiving() + " trees to survive each round."}'></i></h4> + <div class='alert bound-status-dashboard span1'> + <h4 id='dashboard-storage'>Total Earnings <i class='icon-info-sign' data-bind='attr: {"data-content": "You need at least " + costOfLiving() + " trees to survive each round."}'></i></h4><p><strong data-bind='css: { "text-error": storage() < costOfLiving(), "text-success": storage() > costOfLiving()}'><span data-bind='text: storage'></span><i class='icon-leaf'></i></strong></p> @@ -353,9 +357,9 @@ </div></div></div> - <div class='span4'> + <div class='span3'><h3>Group Status</h3> - <table class='table table-bordered table-condensed'> + <table class='table table-bordered table-condensed group-status'><colgroup><col><!-- ko foreach: playerData --> @@ -365,7 +369,7 @@ <thead><tr><th>Player</th><!-- ko foreach: playerData --> - <th data-bind='text: number'></th> + <th data-bind='css: { "current-player": id() === $root.participantGroupId() }, text: number'></th><!-- /ko --></tr></thead> @@ -377,79 +381,22 @@ <!-- /ko --></tr><tr> - <td>Storage</td> + <td>Earnings</td><!-- ko foreach: playerData --><td data-bind='text: storage, css: { "current-player": id() === $root.participantGroupId() }'></td><!-- /ko --></tr><tr> - <td>Status</td> + <td>Alive?</td><!-- ko foreach: playerData --> - <td data-bind='css: { "current-player": id() === $root.participantGroupId(), "text-error": ! alive(), "text-success": alive() }, text: alive() ? "Alive" : "Deceased"'></td> + <td data-bind='css: { "current-player": id() === $root.participantGroupId(), "text-error": ! alive(), "text-success": alive() }, text: alive() ? "Y" : "N"'></td><!-- /ko --></tr></tbody></table></div></div> -<h3>Forest</h3> -<div data-bind='if: isPracticeRound'> - <div class='alert alert-error alert-block'> - <h4>PRACTICE ROUND</h4> - This is a practice round. The decisions you make in this round will <b>NOT</b> contribute to your earnings. - </div> -</div> - -<div data-bind="ifnot: isResourceEmpty" id='resourceDisplay'> - <div class='alert alert-info'>There are <strong class='badge badge-success' data-bind='text:resourceLevel'></strong> trees remaining in the forest.</div> - <div data-bind='style: { width: uniformResourceImageWidth, height: uniformResourceImageHeight, background: resourceImageBackgroundUrl }'> - - </div> - {% comment %} FIXME: crummy use of "px" concatenation, use something like inPixels(..) instead? {% endcomment %} - <div data-bind='style: { width: leftoverResourceImageWidth, height: resourceImageHeight() + "px", background: resourceImageBackgroundUrl }'> - - </div> -</div> -<div data-bind="if: isResourceEmpty"> - <div class='well'> - <center><img src="{% static 'images/forestry/deforestation.jpg' %}" class="img-polaroid" width="425" - height="282"></center> - </div> - <!-- this centers the image - <div style='padding: 8px; margin: auto; border: solid 1px; background: url("{{STATIC_URL}}images/forestry/deforestation.jpg") no-repeat center; height: 282px; width:425px;'> - - </div> - --> - <div class='alert alert-error'><i class='icon-warning-sign'></i> There are no more trees to harvest. Please wait until the next round begins.</div> -</div> -<div data-bind='if: canObserveOtherGroup'> - <h3>Observe Other Group</h3> - <div class='row'> - <div class='span4'> - <table> - <tr> - <td><button class='btn' data-bind='click: showOtherGroup'><i class='icon-eye-open'></i> Observe</a></td> - <td><img src='{{STATIC_URL}}/images/bound/observe.png' alt='observe'></td> - </tr> - </table> - </div> - <div class='span5'> - <div data-bind='if: shouldShowOtherGroup'> - <table class='table table-bordered table-condensed'> - <caption>Observation Results</caption> - <thead> - <tr><th></th><th>Other Group</th></tr> - </thead> - <tbody> - <tr><td>trees in forest</td><td data-bind='text:otherGroupResourceLevel()'></td></tr> - <tr><td>average harvest</td><td data-bind='text:otherGroupAverageHarvest().toFixed(1)'></td></tr> - <tr><td>average storage</td><td data-bind='text:otherGroupAverageStorage().toFixed(1)'></td></tr> - </tbody> - </table> - </div> - </div> - </div> -</div> +<div class='row' data-bind='template: { name: "resource-visualization-template" }'></div><div data-bind='visible: ! isResourceEmpty()'><h3>Harvest</h3><div data-bind='if: submitted'> @@ -475,6 +422,62 @@ </div></div></script> +<script type='text/html' id='resource-visualization-template'> +<div data-bind='if: isPracticeRound'> + <div class='alert alert-error alert-block'> + <h4>PRACTICE ROUND</h4> + This is a practice round. The decisions you make in this round will <b>NOT</b> contribute to your earnings. + </div> +</div> + +<div data-bind='css: { "span4": canObserveOtherGroup }'> +<h4>My Group</h4> +<div class='alert alert-message'><strong class='badge badge-success' data-bind='text:resourceLevel'></strong> trees</div> +<div data-bind="visible: isResourceEmpty"> + <div class='well'> + <center><img src="{% static 'images/forestry/deforestation.jpg' %}" class="img-polaroid" width="425" + height="282"></center> + </div> + <div class='alert alert-error'><i class='icon-warning-sign'></i> There are no more trees to harvest. Please wait until the next round begins.</div> +</div> +<div data-bind='ifnot: isResourceEmpty'> +<div data-bind='style: { width: blockResourceVisualizationImageWidth(resourceLevel), height: blockResourceVisualizationImageHeight(resourceLevel), background: resourceImageBackgroundUrl }'></div> +{% comment %} FIXME: crummy use of "px" concatenation, use something like inPixels(..) instead? {% endcomment %} +<div data-bind='style: { width: remainderResourceImageWidth(resourceLevel), height: resourceImageHeight() + "px", background: resourceImageBackgroundUrl }'></div> +</div> +<table class='table table-bordered table-condensed table-striped'> + <tbody> + <tr><td>forest</td><td data-bind='text:resourceLevel'></td></tr> + <tr><td>average harvest</td><td data-bind='text:averageHarvest().toFixed(1)'></td></tr> + <tr><td>average earnings</td><td data-bind='text:averageStorage().toFixed(1)'></td></tr> + <tr><td>number alive</td><td data-bind='text:numberAlive'></td></tr> + </tbody> +</table> +</div> +<div data-bind='if: canObserveOtherGroup' class='span4'> +<h4>Other Group</h4> +<div class='alert alert-message'><strong class='badge badge-success' data-bind='text:otherGroupResourceLevel'></strong> trees</div> +<div data-bind="visible: isResourceEmpty"> + <div class='well'> + <center><img alt='deforested' src="{% static 'images/forestry/deforestation.jpg' %}" class="img-polaroid" width="425" height="282"></center> + </div> + <div class='alert alert-error'><i class='icon-warning-sign'></i> There are no more trees to harvest.</div> +</div> +<div data-bind='ifnot: isResourceEmpty'> +<div data-bind='style: { width: blockResourceVisualizationImageWidth(otherGroupResourceLevel), height: blockResourceVisualizationImageHeight(otherGroupResourceLevel), background: resourceImageBackgroundUrl }'></div> +{% comment %} FIXME: crummy use of "px" concatenation, use something like inPixels(..) instead? {% endcomment %} +<div data-bind='style: { width: remainderResourceImageWidth(otherGroupResourceLevel), height: resourceImageHeight() + "px", background: resourceImageBackgroundUrl }'></div> +</div> +<table class='table table-bordered table-condensed table-striped'> + <tbody> + <tr><td>forest</td><td data-bind='text:otherGroupResourceLevel()'></td></tr> + <tr><td>average harvest</td><td data-bind='text:otherGroupAverageHarvest().toFixed(1)'></td></tr> + <tr><td>average earnings</td><td data-bind='text:otherGroupAverageStorage().toFixed(1)'></td></tr> + <tr><td>number alive</td><td data-bind='text:otherGroupNumberAlive'></td></tr> + </tbody> +</table> +</div> +</script><script type='text/html' id='harvest-decision-multi-select-template'><table class='table'><tr class='row harvest-decision-resources' data-bind='foreach: harvestDecisionOptions'> @@ -591,12 +594,19 @@ model.isResourceEmpty = ko.computed(function() { return model.resourceLevel() == 0; }) - model.resourcesPerRow = ko.observable(40); - model.resourceImageWidth = ko.observable(20); - model.resourceImageHeight = ko.observable(40); - model.rowsToDisplay = ko.computed(function() { - return Math.floor(model.resourceLevel() / model.resourcesPerRow()); + model.resourcesPerRow = ko.computed(function() { + if (model.canObserveOtherGroup()) { + return 37; + } + else { + return 80; + } }); + model.resourceImageWidth = ko.observable(10); + model.resourceImageHeight = ko.observable(20); + model.rowsToDisplay = function(resourceLevel) { + return Math.floor(resourceLevel() / model.resourcesPerRow()); + }; model.individualResourcesToDisplay = ko.computed(function() { return model.resourceLevel() % model.resourcesPerRow(); }); @@ -608,18 +618,18 @@ }); model.resourceImageUrl = ko.observable("{{STATIC_URL}}images/bound/tree-inactive.png"); model.resourceImageBackgroundUrl = ko.observable("url('{{STATIC_URL}}images/bound/tree-resource.png')"); - model.uniformResourceImageWidth = ko.computed(function() { + model.blockResourceVisualizationImageWidth = function(resourceLevel) { return (model.resourcesPerRow() * model.resourceImageWidth()) + "px"; - }); - model.uniformResourceImageHeight = ko.computed(function() { - var rowsToDisplay = model.rowsToDisplay(); + }; + model.blockResourceVisualizationImageHeight = function(resourceLevel) { + var rowsToDisplay = model.rowsToDisplay(resourceLevel); console.debug("displaying " + rowsToDisplay + " rows."); return (rowsToDisplay * model.resourceImageHeight()) + "px"; - }); - model.leftoverResourceImageWidth = ko.computed(function() { - var remainder = model.resourceLevel() % model.resourcesPerRow(); + }; + model.remainderResourceImageWidth = function(resourceLevel) { + var remainder = resourceLevel() % model.resourcesPerRow(); return (remainder * model.resourceImageWidth()) + "px"; - }); + }; model.startRound = function() { // reset other group view model.shouldShowOtherGroup(false); diff -r 92a35d99eafc44b4adbbf9a2727535b73307d1ce -r 4a98b2a3061967787df85d09ec201e25e5878f2c vcweb/bound/views.py --- a/vcweb/bound/views.py +++ b/vcweb/bound/views.py @@ -1,3 +1,5 @@ +from collections import Counter +from operator import itemgetter from django.http import Http404 from django.shortcuts import render, redirect, get_object_or_404 from vcweb.core import dumps @@ -8,8 +10,8 @@ from vcweb.bound.models import (get_experiment_metadata, get_regrowth_rate, get_max_allowed_harvest_decision, get_cost_of_living, get_resource_level, get_initial_resource_level, get_total_storage, get_storage, get_all_session_storages, get_last_harvest_decision, get_harvest_decision_dv, get_harvest_decision_parameter, - set_harvest_decision, can_observe_other_group, get_player_status, get_average_harvest, get_average_storage, - get_total_harvest) + set_harvest_decision, can_observe_other_group, is_player_alive, get_average_harvest, get_average_storage, + get_total_harvest, get_number_alive) from urllib import urlencode import logging @@ -137,18 +139,22 @@ own_group = participant_group_relationship.group own_resource_level = get_resource_level(own_group) last_harvest_decision = get_last_harvest_decision(participant_group_relationship, round_data=previous_round_data) + # FIXME: redundancy with playerData and direct values experiment_model_dict['playerData'] = [{ 'id': pgr.pk, 'number': pgr.participant_number, 'lastHarvestDecision': get_last_harvest_decision(pgr, round_data=previous_round_data), - 'alive': get_player_status(pgr, current_round_data), + 'alive': is_player_alive(pgr, current_round_data), 'storage': get_storage(pgr, current_round_data), } for pgr in own_group.participant_group_relationship_set.all()] - # FIXME: redundancy with playerData experiment_model_dict['lastHarvestDecision'] = last_harvest_decision experiment_model_dict['storage'] = get_storage(participant_group_relationship, current_round_data) experiment_model_dict['resourceLevel'] = own_resource_level - experiment_model_dict['alive'] = get_player_status(participant_group_relationship, current_round_data) + experiment_model_dict['alive'] = is_player_alive(participant_group_relationship, current_round_data) + experiment_model_dict['averageHarvest'] = get_average_harvest(own_group, previous_round_data) + experiment_model_dict['averageStorage'] = get_average_storage(own_group, current_round_data) + c = Counter(map(itemgetter('alive'), experiment_model_dict['playerData'])) + experiment_model_dict['numberAlive'] = "%s out of %s" % (c[True], sum(c.values())) # participant group data parameters are only needed if this round is a data round or the previous round was a data round if previous_round.is_playable_round or current_round.is_playable_round: harvest_decision = get_harvest_decision_dv(participant_group_relationship, current_round_data) @@ -165,5 +171,7 @@ experiment_model_dict['otherGroupResourceLevel'] = get_resource_level(other_group, current_round_data) experiment_model_dict['otherGroupAverageHarvest'] = get_average_harvest(other_group, previous_round_data) experiment_model_dict['otherGroupAverageStorage'] = get_average_storage(other_group, current_round_data) + number_alive = get_number_alive(other_group, current_round_data) + experiment_model_dict['otherGroupNumberAlive'] = "%s out of %s" % (number_alive, other_group.size) return dumps(experiment_model_dict) diff -r 92a35d99eafc44b4adbbf9a2727535b73307d1ce -r 4a98b2a3061967787df85d09ec201e25e5878f2c vcweb/static/images/boundaries/observe.png Binary file vcweb/static/images/boundaries/observe.png has changed 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. |
From: <com...@bi...> - 2013-04-22 10:42:17
|
1 new commit in vcweb: https://bitbucket.org/virtualcommons/vcweb/commits/92a35d99eafc/ Changeset: 92a35d99eafc User: alllee Date: 2013-04-22 12:42:02 Summary: fixing resource visualization to show entire resource, still needs work to handle group clusters properly Affected #: 2 files diff -r 3de9b66ce63ec9e33e89786b71dc705b266d56db -r 92a35d99eafc44b4adbbf9a2727535b73307d1ce vcweb/bound/static/images/bound/tree-resource.png Binary file vcweb/bound/static/images/bound/tree-resource.png has changed diff -r 3de9b66ce63ec9e33e89786b71dc705b266d56db -r 92a35d99eafc44b4adbbf9a2727535b73307d1ce vcweb/bound/templates/bound/participate.html --- a/vcweb/bound/templates/bound/participate.html +++ b/vcweb/bound/templates/bound/participate.html @@ -402,10 +402,12 @@ <div data-bind="ifnot: isResourceEmpty" id='resourceDisplay'><div class='alert alert-info'>There are <strong class='badge badge-success' data-bind='text:resourceLevel'></strong> trees remaining in the forest.</div> - <div class='well'> - <div data-bind='style: { width: resourceImageWidth, height: resourceImageHeight, background: resourceImageBackgroundUrl }'> + <div data-bind='style: { width: uniformResourceImageWidth, height: uniformResourceImageHeight, background: resourceImageBackgroundUrl }'> </div> + {% comment %} FIXME: crummy use of "px" concatenation, use something like inPixels(..) instead? {% endcomment %} + <div data-bind='style: { width: leftoverResourceImageWidth, height: resourceImageHeight() + "px", background: resourceImageBackgroundUrl }'> + </div></div><div data-bind="if: isResourceEmpty"> @@ -589,18 +591,35 @@ model.isResourceEmpty = ko.computed(function() { return model.resourceLevel() == 0; }) + model.resourcesPerRow = ko.observable(40); + model.resourceImageWidth = ko.observable(20); + model.resourceImageHeight = ko.observable(40); + model.rowsToDisplay = ko.computed(function() { + return Math.floor(model.resourceLevel() / model.resourcesPerRow()); + }); + model.individualResourcesToDisplay = ko.computed(function() { + return model.resourceLevel() % model.resourcesPerRow(); + }); model.resourcesToDisplay = ko.computed(function() { if (model.resourceLevel() > 0) { return Math.min(model.resourceLevel(), model.maximumResourcesToDisplay()); } return 0; }); - model.resourceImageUrl = ko.observable("{{STATIC_URL}}images/bound/deciduous-tree.png"); - model.resourceImageBackgroundUrl = ko.observable("url('{{STATIC_URL}}images/forestry/pine-tree.png')"); - model.resourceImageWidth = ko.computed(function() { - return model.resourcesToDisplay() * 30 + "px"; + model.resourceImageUrl = ko.observable("{{STATIC_URL}}images/bound/tree-inactive.png"); + model.resourceImageBackgroundUrl = ko.observable("url('{{STATIC_URL}}images/bound/tree-resource.png')"); + model.uniformResourceImageWidth = ko.computed(function() { + return (model.resourcesPerRow() * model.resourceImageWidth()) + "px"; }); - model.resourceImageHeight = ko.observable("79px"); + model.uniformResourceImageHeight = ko.computed(function() { + var rowsToDisplay = model.rowsToDisplay(); + console.debug("displaying " + rowsToDisplay + " rows."); + return (rowsToDisplay * model.resourceImageHeight()) + "px"; + }); + model.leftoverResourceImageWidth = ko.computed(function() { + var remainder = model.resourceLevel() % model.resourcesPerRow(); + return (remainder * model.resourceImageWidth()) + "px"; + }); model.startRound = function() { // reset other group view model.shouldShowOtherGroup(false); 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. |
From: <com...@bi...> - 2013-04-22 09:35:37
|
1 new commit in vcweb: https://bitbucket.org/virtualcommons/vcweb/commits/3de9b66ce63e/ Changeset: 3de9b66ce63e User: alllee Date: 2013-04-22 11:35:23 Summary: adding tree icons from shelby Affected #: 4 files diff -r 0aa66ba028003619ad69610ba68d54fc056e7a8c -r 3de9b66ce63ec9e33e89786b71dc705b266d56db vcweb/bound/static/images/bound/tree-active.png Binary file vcweb/bound/static/images/bound/tree-active.png has changed diff -r 0aa66ba028003619ad69610ba68d54fc056e7a8c -r 3de9b66ce63ec9e33e89786b71dc705b266d56db vcweb/bound/static/images/bound/tree-bw-outline.png Binary file vcweb/bound/static/images/bound/tree-bw-outline.png has changed diff -r 0aa66ba028003619ad69610ba68d54fc056e7a8c -r 3de9b66ce63ec9e33e89786b71dc705b266d56db vcweb/bound/static/images/bound/tree-hover.png Binary file vcweb/bound/static/images/bound/tree-hover.png has changed diff -r 0aa66ba028003619ad69610ba68d54fc056e7a8c -r 3de9b66ce63ec9e33e89786b71dc705b266d56db vcweb/bound/static/images/bound/tree-inactive.png Binary file vcweb/bound/static/images/bound/tree-inactive.png has changed 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. |