aboutsummaryrefslogtreecommitdiff
path: root/site/app
diff options
context:
space:
mode:
authorJoachim Filip Ignacy Bartosik <jbartosik@gmail.com>2011-05-13 18:53:18 +0200
committerJoachim Filip Ignacy Bartosik <jbartosik@gmail.com>2011-05-24 18:55:39 +0200
commit83a9df9a9daf85bd6b13bfc8fdedec8f8780ce13 (patch)
tree014c385bae8ede30631c9eb3fe6394d772963f3b /site/app
parentAgenda lifecycle (semi-automatically managed) (diff)
downloadcouncil-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.rb12
-rw-r--r--site/app/models/agenda.rb6
-rw-r--r--site/app/models/agenda_item.rb53
-rw-r--r--site/app/viewhints/agenda_hints.rb5
-rw-r--r--site/app/views/agenda_items/show.dryml14
-rw-r--r--site/app/views/agendas/show.dryml8
-rw-r--r--site/app/views/taglibs/application.dryml2
-rw-r--r--site/app/views/taglibs/main_nav.dryml7
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>