From 81d84b3498d1ed7510492620a0839b0a1bddf218 Mon Sep 17 00:00:00 2001 From: lars Date: Thu, 15 Apr 2010 11:50:58 +0000 Subject: [PATCH] added submission of content added more detailed poll view changed default settings to be more verbose --- wortschlucker/database.sqlite | Bin 4096 -> 4096 bytes wortschlucker/forms.py | 4 ++ .../templates/poll_admin_details.html | 4 +- wortschlucker/templates/poll_details.html | 48 ++++++++++++++--- wortschlucker/wortschlucker.py | 50 +++++++++++++++--- 5 files changed, 91 insertions(+), 15 deletions(-) diff --git a/wortschlucker/database.sqlite b/wortschlucker/database.sqlite index 3cfa91c95600f9cc5bebb7f67343a0384568ebab..74bf7f110389efe9a9fbe743ec37df5fecc88a5d 100644 GIT binary patch literal 4096 zcmeHJ%Wl&^6!oJdr3HyDqNqYeLs3hjwvz4fBle0=8B}OONxYz|XzZCZhQzMy2`vj2 zEnk4df*)ber?BKR7~7#ZNn3TnuD(*@nR}1UopZ)xyZd(Erv&uFXoM($+yck*+%o_; zj(fm<`4HKJ&n5EXTzY{v4PWkzHftk1=N-R3m=2Mwqw7vJK&(R*J^eS!E5_)JFTT~ANMj0*nQLPI-Mqi zXGCeGM^62i#-L-ruse2p*Y2jpnvd%sWBEWn0mpvlWV4TGI40?QseblZC|6~f|FV&4 z@WOzSfcE0CJM!b$4}m8KItcTU1}Gl%roBga^G671&LlZl!m8a-E*-gDW0oB&vZ=_5zjDHXetO}z3*bf@C+9c#b~1u3F3I{4G3jV8AXz% z9ZB7hH6TMv)h$VR&o6S7R;#)S_fZr>SwXsvW!U#vKUFdN(2!iUA-Ou%r9Lt=RaS{% z7=44N5W5XeG7&T(hFFu3fgRRF4#p9P!|7hKX=z4s{+ER&C;k$Dh+oAc(Gu?ozlEQ| zcOhWuA_@ntcVKI|#8sa1>8%=s-T)Avy)DTp6{hbtwP7i8ZK=equ4Q0FP2ndf=4X(a zrAnK3OI-Eg1eu%@5}|n>=ThYD62sIp%s9Z{uN)H1 zpcUOxw5>ar2&YW=C1AO>z`&0)>Z@rrOVQWGe+x}?&$4NjEY$^O&V)_5nohMO^$}m< dR#te}B6vJY1udv0=bwG_7g0D+IB*Lc_ydZldT9Uv delta 167 zcmZorXi%6SCB$gWfC|_r>R9qJ=P@udaxgH>WIV&jF|lzPbE6~6G`=I4R9lcSj=S-^~HrYUS(nm|h?O>FEH yWZ?x_$HKtCtj?^?WXWW?S&&7CiSgaU#sbFLiH$XkHzzh`Gv-cg%v{970z?3S&?=z- diff --git a/wortschlucker/forms.py b/wortschlucker/forms.py index 5ea06ca..cbf41b0 100644 --- a/wortschlucker/forms.py +++ b/wortschlucker/forms.py @@ -5,3 +5,7 @@ class PollForm(formencode.Schema): title = formencode.validators.UnicodeString(strip=True, not_empty=True) description = formencode.validators.UnicodeString(strip=True, not_empty=True) +class SubmitForm(formencode.Schema): + submitter = formencode.validators.UnicodeString(strip=True, not_empty=True) + content = formencode.validators.UnicodeString(strip=True, not_empty=True) + diff --git a/wortschlucker/templates/poll_admin_details.html b/wortschlucker/templates/poll_admin_details.html index 6663308..d8fb5d7 100644 --- a/wortschlucker/templates/poll_admin_details.html +++ b/wortschlucker/templates/poll_admin_details.html @@ -13,8 +13,8 @@
  • Author: ${poll.author}
  • Created: ${poll.get_creation_time_string()}
  • Description: ${poll.description}
  • -
  • User URL: ${poll.get_url()}
  • -
  • Administrative URL: ${poll.get_admin_url()}
  • +
  • Public URL: ${poll.get_url()}
  • +
  • Administrative URL: ${poll.get_admin_url()} (here)
  • Settings:
    • ${key}: ${value}
  • diff --git a/wortschlucker/templates/poll_details.html b/wortschlucker/templates/poll_details.html index 73cacca..249d1a4 100644 --- a/wortschlucker/templates/poll_details.html +++ b/wortschlucker/templates/poll_details.html @@ -9,13 +9,47 @@

    Poll: ${poll.title}

    -
      -
    • Author: ${poll.author}
    • -
    • Created: ${poll.get_creation_time_string()}
    • -
    • Description: ${poll.description}
    • -
    • URL: ${poll.get_url()}
    • -
    +
    +
      +
    • Author: ${poll.author}
    • +
    • Description: ${poll.description}
    • +
    • Created: ${poll.get_creation_time_string()}
    • +
    • Public URL: ${poll.get_url()}
    • +
    +
    +
    +

    Submit something

    +
    +
      +
    • + ${errors.submitter}
    • +
    • + ${errors.content}
    • +
    + +
    +
    + +
    +

    Previous submissions

    + + + + + + + +
    SubmitterContentTimestamp
    ${one_submission.submitter}${one_submission.content}${one_submission.get_creation_time_string()}
    + No submissions posted +
    + +
    +

    Statistics

    +
      +
    • Number of submitters: ${poll.get_num_of_submitters()}
    • +
    • Number of submissions: ${poll.get_num_of_submissions()}
    • +
    +
    - diff --git a/wortschlucker/wortschlucker.py b/wortschlucker/wortschlucker.py index 88f990a..dee21dd 100755 --- a/wortschlucker/wortschlucker.py +++ b/wortschlucker/wortschlucker.py @@ -27,20 +27,26 @@ BASE_DICT = { } POLL_SETTINGS = { - "show_all_submissions": (bool, False), + "show_all_submissions": (bool, True), "show_statistics": (bool, True), } -class WordSubmission(sqlobject.SQLObject): +class ContentSubmission(sqlobject.SQLObject): submitter = sqlobject.StringCol() content = sqlobject.StringCol() poll_id = sqlobject.ForeignKey("Poll") + timestamp_creation = sqlobject.DateTimeCol() + + def get_creation_time_string(self): + return str(self.timestamp_creation) + class PollSetting(sqlobject.SQLObject): poll_id = sqlobject.ForeignKey("Poll") key = sqlobject.StringCol() value = sqlobject.StringCol() + class Poll(sqlobject.SQLObject): author = sqlobject.StringCol() hash_key = sqlobject.StringCol() @@ -67,7 +73,7 @@ class Poll(sqlobject.SQLObject): poll_setting.value = str(validated_value) def get_num_of_submitters(self): - all_submitters = [submission.submitter for submission in WordSubmission.selectBy(poll_id=self.id)] + all_submitters = [submission.submitter for submission in ContentSubmission.selectBy(poll_id=self.id)] unique_submitters = [] for submitter in all_submitters: if not submitter in unique_submitters: @@ -75,10 +81,13 @@ class Poll(sqlobject.SQLObject): return len(unique_submitters) def get_num_of_submissions(self): - return WordSubmission.selectBy(poll_id=self.id).count() + return ContentSubmission.selectBy(poll_id=self.id).count() + + def get_submissions(self): + return ContentSubmission.selectBy(poll_id=self.id) def delete_poll(self): - submissions = WordSubmission.selectBy(poll_id=self.id) + submissions = ContentSubmission.selectBy(poll_id=self.id) settings = PollSetting.selectBy(poll_id=self.id) for submission in submissions: submission.destroySelf() @@ -89,6 +98,9 @@ class Poll(sqlobject.SQLObject): def get_url(self): return "%spolls/%s" % (BASE_DICT["base_url"], self.hash_key) + def get_submit_url(self): + return "%spolls/%s/submit" % (BASE_DICT["base_url"], self.hash_key) + def get_admin_url(self): return "%spolls/%s" % (BASE_DICT["base_url"], self.admin_hash_key) @@ -183,6 +195,32 @@ def new_poll(submit=None, cancel=None, author=None, title=None, description=None new_poll = Poll(hash_key=hash_key, admin_hash_key=admin_hash_key, timestamp_creation=now, **data) return bobo.redirect(new_poll.get_admin_url()) +@bobo.query('/polls/:hash_key/submit') +def submit_content(hash_key=None, submitter=None, content=None): + value_dict = get_default_values() + data = {"submitter": submitter, "content": content} + poll_id = get_poll_id(hash_key) + if not poll_id is None: + poll = Poll.get(poll_id) + value_dict["poll"] = poll + errors = {} + try: + data = forms.SubmitForm.to_python(data) + except formencode.Invalid, errors_packed: + errors = errors_packed.unpack_errors() + if errors: + value_dict["errors"] = errors + return render("poll_details.html", input_data=data, **value_dict) + else: + # create the new submission content + data["timestamp_creation"] = datetime.datetime.now() + data["poll_id"] = poll.id + ContentSubmission(**data) + # remove "content" for the next input + del data["content"] + return render("poll_details.html", input_data=data, **value_dict) + return bobo.redirect(BASE_DICT["base_url"]) + @bobo.query('/polls/:admin_hash_key/delete') def delete_poll(admin_hash_key=None): admin_poll_id = get_poll_admin_id(admin_hash_key) @@ -277,7 +315,7 @@ def show_one_poll(poll_hash=None): return bobo.redirect(BASE_DICT["base_url"]) -for table in (Poll, WordSubmission, PollSetting): +for table in (Poll, ContentSubmission, PollSetting): #Poll.dropTable() if not table.tableExists(): table.createTable()