diff options
author | Joachim Filip Ignacy Bartosik <jbartosik@gmail.com> | 2011-05-13 18:53:18 +0200 |
---|---|---|
committer | Joachim Filip Ignacy Bartosik <jbartosik@gmail.com> | 2011-05-24 18:55:39 +0200 |
commit | 83a9df9a9daf85bd6b13bfc8fdedec8f8780ce13 (patch) | |
tree | 014c385bae8ede30631c9eb3fe6394d772963f3b /site/app | |
parent | Agenda lifecycle (semi-automatically managed) (diff) | |
download | council-webapp-83a9df9a9daf85bd6b13bfc8fdedec8f8780ce13.tar.gz council-webapp-83a9df9a9daf85bd6b13bfc8fdedec8f8780ce13.tar.bz2 council-webapp-83a9df9a9daf85bd6b13bfc8fdedec8f8780ce13.zip |
Agenda items
Diffstat (limited to 'site/app')
-rw-r--r-- | site/app/controllers/agenda_items_controller.rb | 12 | ||||
-rw-r--r-- | site/app/models/agenda.rb | 6 | ||||
-rw-r--r-- | site/app/models/agenda_item.rb | 53 | ||||
-rw-r--r-- | site/app/viewhints/agenda_hints.rb | 5 | ||||
-rw-r--r-- | site/app/views/agenda_items/show.dryml | 14 | ||||
-rw-r--r-- | site/app/views/agendas/show.dryml | 8 | ||||
-rw-r--r-- | site/app/views/taglibs/application.dryml | 2 | ||||
-rw-r--r-- | site/app/views/taglibs/main_nav.dryml | 7 |
8 files changed, 107 insertions, 0 deletions
diff --git a/site/app/controllers/agenda_items_controller.rb b/site/app/controllers/agenda_items_controller.rb new file mode 100644 index 0000000..4d28112 --- /dev/null +++ b/site/app/controllers/agenda_items_controller.rb @@ -0,0 +1,12 @@ +class AgendaItemsController < ApplicationController + + hobo_model_controller + + auto_actions :all, :except => :index + before_filter :login, :except => :show + + protected + def login + redirect_to user_login_path unless current_user.signed_up? + end +end diff --git a/site/app/models/agenda.rb b/site/app/models/agenda.rb index def1643..5998ae8 100644 --- a/site/app/models/agenda.rb +++ b/site/app/models/agenda.rb @@ -7,6 +7,8 @@ class Agenda < ActiveRecord::Base timestamps end + has_many :agenda_items + lifecycle do state :open, :default => true state :submissions_closed, :meeting_ongoing, :old @@ -67,6 +69,10 @@ class Agenda < ActiveRecord::Base end end + def current? + ['open', 'submissions_closed'].include?(state.to_s) + end + protected def there_is_only_one_non_archival_agenda return if(state.to_s == 'old') diff --git a/site/app/models/agenda_item.rb b/site/app/models/agenda_item.rb new file mode 100644 index 0000000..1bb3a36 --- /dev/null +++ b/site/app/models/agenda_item.rb @@ -0,0 +1,53 @@ +class AgendaItem < ActiveRecord::Base + + hobo_model # Don't put anything above this + + fields do + title :string + discussion :string + body :text + rejected :boolean, :default => false + timestamps + end + + belongs_to :user, :creator => true + belongs_to :agenda + + # --- Permissions --- # + def create_permitted? + return false if acting_user.guest? + return false if user != acting_user + true + end + + def update_permitted? + return false if agenda._?.state == 'archived' + return false if user_changed? + return true if acting_user.council_member? + return true if acting_user.administrator? + return false unless agenda.nil? + return true if acting_user == user + false + end + + def destroy_permitted? + acting_user.administrator? + end + + def view_permitted?(field) + true + end + + # Not deduced properly + def edit_permitted?(field) + return false if field == :rejected && !agenda.nil? + return false if field == :agenda && rejected? + return false if agenda._?.state == 'archived' + return false if field == :user + return true if acting_user.administrator? + return true if acting_user.council_member? + return false unless agenda.nil? + return acting_user == user if [nil, :title, :discussion, :body].include?(field) + end + +end diff --git a/site/app/viewhints/agenda_hints.rb b/site/app/viewhints/agenda_hints.rb new file mode 100644 index 0000000..05c7b96 --- /dev/null +++ b/site/app/viewhints/agenda_hints.rb @@ -0,0 +1,5 @@ +class AgendaHints < Hobo::ViewHints + + children :agenda_items + +end diff --git a/site/app/views/agenda_items/show.dryml b/site/app/views/agenda_items/show.dryml new file mode 100644 index 0000000..626298d --- /dev/null +++ b/site/app/views/agenda_items/show.dryml @@ -0,0 +1,14 @@ +<show-page> + <append-content:> + <form if="&this.editable_by?(current_user, :agenda)"> + <input value="&Agenda.current.id" type="hidden" name="agenda_item[agenda_id]"/> + <submit label="Add to current agenda"/> + </form> + + <form if="&this.editable_by?(current_user, :rejected)"> + <input value="&!this.rejected?" type="hidden" name="agenda_item[rejected]"/> + <submit label="Reject" unless="&this.rejected"/> + <submit label="Un-reject" if="&this.rejected"/> + </form> + </append-content:> +</show-page> diff --git a/site/app/views/agendas/show.dryml b/site/app/views/agendas/show.dryml index 7df2b72..113edb4 100644 --- a/site/app/views/agendas/show.dryml +++ b/site/app/views/agendas/show.dryml @@ -1,4 +1,12 @@ <show-page> + <append-collection-section: if="&this.current?"> + <h3 class="collection-heading"> + Suggested items: + </h3> + <with with="&AgendaItem.all(:conditions => { :agenda_id => nil })"> + <collection unless="&this.nil?" /> + </with> + </append-collection-section:> <append-content-body:> <div class="transition" if="&Agenda.transitions_available(current_user)"> <collection:possible_transitions> diff --git a/site/app/views/taglibs/application.dryml b/site/app/views/taglibs/application.dryml index 2f08a8e..017831f 100644 --- a/site/app/views/taglibs/application.dryml +++ b/site/app/views/taglibs/application.dryml @@ -6,4 +6,6 @@ <include src="taglibs/auto/rapid/pages"/> <include src="taglibs/auto/rapid/forms"/> +<include src="taglibs/main_nav"/> + <set-theme name="clean"/> diff --git a/site/app/views/taglibs/main_nav.dryml b/site/app/views/taglibs/main_nav.dryml new file mode 100644 index 0000000..af60c6d --- /dev/null +++ b/site/app/views/taglibs/main_nav.dryml @@ -0,0 +1,7 @@ +<def tag="main-nav"> + <navigation class="main-nav" merge-attrs param="default"> + <nav-item href="#{base_url}/">Home</nav-item> + <nav-item with="&Agenda"><ht key="agenda.nav_item" count="100"><model-name-human count="100"/></ht></nav-item> + <nav-item href="&new_agenda_item_path">Suggest agenda item</nav-item> + </navigation> +</def> |