diff --git a/wortschlucker/src/wortschlucker.py b/wortschlucker/src/wortschlucker.py index 8a54b63..c5f424f 100755 --- a/wortschlucker/src/wortschlucker.py +++ b/wortschlucker/src/wortschlucker.py @@ -65,6 +65,7 @@ POLL_SETTINGS = { "public": (bool, False), "expose_date": (datetime.datetime, DEFAULT_DATE), "close_date": (datetime.datetime, DEFAULT_DATE), + "vote_open": (bool, False), } POLL_SETTING_TEMPLATES = { @@ -97,7 +98,10 @@ class ContentSubmission(sqlobject.SQLObject): def get_delete_url(self, absolute=False): return self.poll_id.get_admin_url(absolute=absolute, suffix="/delete/%s" % self.get_obfuscated_digest()) - + def get_vote_toggle_url(self, absolute=False): + return self.poll_id.get_admin_url(absolute=absolute, + suffix="/vote_toggle/%s" % self.get_obfuscated_digest()) + def get_obfuscated_digest(self): return hashlib.md5(str(self.id)).hexdigest() @@ -251,9 +255,15 @@ class Poll(sqlobject.SQLObject): def get_delete_url(self, absolute=False): return get_url_string("%s%s/delete" % (BASE_DICT["base_url"], self.admin_hash_key), absolute) + def get_vote_toggle_url(self, absolute=False): + return get_url_string("%s%s/vote_toggle" % (BASE_DICT["base_url"], self.admin_hash_key), absolute) + def get_creation_time_string(self): return str(self.timestamp_creation) + def is_vote_open(self): + return self.get_settings()["vote_open"] + def get_submissions_visibility(self): settings = self.get_settings() return bool(settings["show_all_submissions"] or (settings["expose_date"] and \ @@ -432,6 +442,11 @@ def get_default_values(request, **kwargs): except ConfigParser.Error: enable_users = False value_dict["enable_users"] = enable_users + try: + enable_voting = config.get("voting", "enabled") + except ConfigParser.Error: + enable_voting = False + value_dict["enable_voting"] = enable_voting # read the user's hash key from the cookie if enable_users and ("user_hash_key" in request.cookies): value_dict["user_hash_key"] = str(request.cookies["user_hash_key"]) @@ -767,6 +782,17 @@ def delete_poll(bobo_request, admin_hash_key=None): poll.delete_poll() return bobo.redirect(BASE_DICT["base_url"]) +@bobo.query('/:admin_hash_key/vote_toggle') +def vote_toggle_poll(bobo_request, admin_hash_key=None, vote_radio=None): + # vote_radio: open/closed + admin_poll_id = get_poll_admin_id(admin_hash_key) + if not admin_poll_id is None: + poll = Poll.get(admin_poll_id) + poll.change_setting("vote_open", vote_radio == "open") + return bobo.redirect(poll.get_admin_url()) + else: + return bobo.redirect(BASE_DICT["base_url"]) + @bobo.query('/:admin_hash_key/delete/:submission_id_digest') def delete_submission(bobo_request, admin_hash_key=None, submission_id_digest=None): admin_poll_id = get_poll_admin_id(admin_hash_key) @@ -963,17 +989,6 @@ def serve_blog(bobo_request, blog_id=None): value_dict["blog_list"] = blog_list return render("blog_list.html", **value_dict) -@bobo.query('') -def base(): - return bobo.redirect(BASE_DICT["base_url"]) - -@bobo.query('/') -@bobo.query('/public') -@bobo.query('/public/') -@bobo.query('/public/page/:page') -def show_frontpage(bobo_request, page=None): - return show_poll_list(bobo_request, "frontpage.html", 20, page) - def show_poll_list(bobo_request, render_file, page_size, page=None, filter_private=True): value_dict = get_default_values(bobo_request) polls = Poll.select().orderBy("-timestamp_creation") @@ -1038,6 +1053,27 @@ def render_poll_admin(bobo_request, poll, add_related, del_related, count, page, value_dict["errors"] = errors return render("poll_admin_details.html", **value_dict) +@bobo.query('/admin') +@bobo.query('/admin/') +@bobo.query('/admin/page/:page') +def show_admin_page(bobo_request, page=None, page_size=20): + try: + page_size = int(page_size) + except ValueError: + page_size = 30 + return show_poll_list(bobo_request, "admin.html", page_size, page, filter_private=False) + +@bobo.query('/') +@bobo.query('/public') +@bobo.query('/public/') +@bobo.query('/public/page/:page') +def show_frontpage(bobo_request, page=None): + return show_poll_list(bobo_request, "frontpage.html", 20, page) + +@bobo.query('') +def base(): + return bobo.redirect(BASE_DICT["base_url"]) + @bobo.query('/:poll_hash') @bobo.query('/:poll_hash/') @bobo.query('/admin/poll/:poll_hash_for_admin') @@ -1080,16 +1116,6 @@ def show_one_poll(bobo_request, poll_hash_for_admin=None, poll_hash=None, else: return bobo.redirect(BASE_DICT["base_url"]) -@bobo.query('/admin') -@bobo.query('/admin/') -@bobo.query('/admin/page/:page') -def show_admin_page(bobo_request, poll_hash, page=None, page_size=20): - try: - page_size = int(page_size) - except ValueError: - page_size = 30 - return show_poll_list(bobo_request, "admin.html", page_size, page, filter_private=False) - @bobo.query('/node/:pagename') def show_static_nodes(bobo_request, pagename=None): """ meant for serving hand-changed, automatically styled content. """ @@ -1120,11 +1146,21 @@ def static_files(p1=None, p2=None, p3=None): pathname = os.path.join(pathname, subdir) return get_static_file(pathname) + for table in (Poll, ContentSubmission, PollSetting, PollRelation, Profile, ProfilePolls): #table.dropTable() if not table.tableExists(): table.createTable() +# how to add new columns to the database: +# * uncomment the line below and change it according to your needs +# * run this script once (manually) +# * disable the line below +# * add the column specification to the object definition +# -> done! +#Poll.sqlmeta.addColumn(sqlobject.BoolCol("vote_open", default=False), changeSchema=True) + + # this line allows to use wortschlucker with mod_wsgi # see: http://groups.google.com/group/bobo-web/msg/2ba55fc381658cd1 # see: http://blog.dscpl.com.au/2009/08/using-bobo-on-top-of-modwsgi.html