Skip to content

Commit

Permalink
changed url, finished Document refactor
Browse files Browse the repository at this point in the history
  • Loading branch information
cies committed Apr 17, 2009
1 parent 4903391 commit ed7cf2b
Show file tree
Hide file tree
Showing 39 changed files with 656 additions and 220 deletions.
3 changes: 2 additions & 1 deletion app/controllers/discussion_posts.rb
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,8 @@ def get_context
when 'StepDocument'
@project = Project.get(params[:project_id]) or raise NotFound
@step = @project.step(params[:step]) or raise NotFound
@document = Document.get(params[:document_id]) or raise NotFound
@document = @step.document(params[:number]) or raise NotFound
# @document_version = @document.version(params[:version]) or raise NotFound
@discussion = @document.discussion or raise NotFound
else
raise "No context to be loaded for #{params[:discussion_parent]}"
Expand Down
71 changes: 43 additions & 28 deletions app/controllers/documents.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@ def real_index
get_context
@documents = case params[:document_parent]
when 'Step'
StepDocument.all(:project_id => @project.id, :discriminator => "Step#{params[:step]}Document")
StepDocument.all(:discriminator => "StepDocument", :project_id => @project.id, :step_number => params[:step])
when 'User'
UserDocument.all(:user_id => @user.id, :discriminator => "UserDocument")
UserDocument.all(:discriminator => "UserDocument", :user_id => @user.id)
else
raise "Unknown parent for document: #{params[:document_parent].inspect}"
end
Expand All @@ -18,10 +18,15 @@ def real_index_redirect # actually more like show
redirect document_url
end

def index # actually more like show
get_context
@document = Document.get(params[:document_id])
render :show
def index(number, version = nil) # actually more like show
get_context; get_document
if version
@document.current_version_number = version
render :show
else
redirect document_url(:number => number, :version => @document.versions.count),
:message => "You have been redireted to the latest version of document ##{number}"
end
end

def new(document_version = nil)
Expand All @@ -30,9 +35,9 @@ def new(document_version = nil)
# create the document first
@document = case params[:document_parent]
when 'Step'
StepDocument.new(:user => session.user, :project => @project, :discriminator => "Step#{params[:step]}Document")
StepDocument.new(:user => session.user, :project => @project, :step => @project.step(params[:step]))
when 'User'
UserDocument.new(:user => session.user, :user => @user, :discriminator => "UserDocument")
UserDocument.new(:user => session.user)
else
raise "Unknown parent for document: #{params[:document_parent].inspect}"
end
Expand All @@ -42,8 +47,8 @@ def new(document_version = nil)
@document_version.user = session.user
@document_version.document = @document
if @document_version.save
to_url = url(:step_document, params[:project_id], params[:step], @document.id)
redirect to_url, :message => "Changes have been saved as version #{@document_version.number}"
@document.current_version_number = @document_version.number
redirect document_url(@document), :message => "Changes have been saved as version #{@document_version.number}"
else
@document.destroy # i see no other way than to destroy @document here (only with initial versions)
render
Expand All @@ -54,16 +59,16 @@ def new(document_version = nil)
end
end

def edit(document_id, document_version = nil)
get_context
@document = Document.get(document_id) or raise NotFound
def edit(document_version = nil)
get_context; get_document
@document.current_version_number = params[:version]
if document_version # form submitted
@document_version = DocumentVersion.new(document_version)
@document_version.user = session.user
@document_version.document = @document
# saving the version update the @document.version_count
if @document_version.save
redirect document_url(:document_id => @document.id), :message => 'Document edited'
@document.current_version_number = @document_version.number
redirect document_url(@document), :message => 'Document edited'
else
render
end
Expand All @@ -75,9 +80,8 @@ def edit(document_id, document_version = nil)
end
end

def history(document_id)
get_context
@document = Document.get(document_id) or raise NotFound
def history
get_context; get_document
if params[:from] and params[:to]
@from_version = @document.version(params[:from]) or raise NotFound
@to_version = @document.version(params[:to]) or raise NotFound
Expand All @@ -89,13 +93,13 @@ def history(document_id)
end
end

def version
get_context
@document_version = DocumentVersion.first(:document_id => params[:document_id], :number => params[:version])
@document = @document_version.document
session[:notification] = :not_implemented_yet if params['revert'] == 'true'
render :show_version
end
# def version
# get_context
# @document_version = DocumentVersion.first(:document_id => params[:document_id], :number => params[:version])
# @document = @document_version.document
# session[:notification] = :not_implemented_yet if params['revert'] == 'true'
# render :show_version
# end

private
def get_context
Expand All @@ -104,10 +108,21 @@ def get_context
@project = Project.get(params[:project_id]) or raise NotFound
@step = @project.step(params[:step]) or raise NotFound
when 'User'
@project = Project.get(params[:project_id]) or raise NotFound
@step = @project.step(params[:step]) or raise NotFound
@user = User.first(:login => params[:login]) or raise NotFound
else
raise "No context to be loaded for #{params[:document_parent]}"
end
end

def get_document
@document = case params[:document_parent]
when 'Step'
StepDocument.first(:project_id => @project.id, :step_number => params[:step],
:step_document_number => params[:number]) or raise NotFound
when 'User'
UserDocument.first(:user_id => @user.login, :user_document_number => params[:number]) or raise NotFound
else
raise "No context to be loaded for #{params[:parent]}"
raise "No document to be loaded for #{params[:document_parent]}"
end
end
end
7 changes: 4 additions & 3 deletions app/controllers/my/votes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,13 @@ def index
end

def new(vote = nil)
if vote.nil? or vote[:vector].nil? # initial page
@vote = Vote.new(vote)
@document = StepDocument.get()
if vote.nil? # initial page
@vote = Vote.new
render
else # form submitted
@vote = Vote.new(vote)
@vote.update_attributes(:voteable_id => voteable_id, :voteable_type => voteable_type)
@vote.update_attributes(:step_document_id => step_document_id)
if @vote.save
redirect url(:my_votes), :message => 'Vote has been saved'
else
Expand Down
23 changes: 15 additions & 8 deletions app/helpers/global_helpers.rb
Original file line number Diff line number Diff line change
Expand Up @@ -25,14 +25,19 @@ def render_object_title_html(obj)
end
end

def document_url(*options)
options, aggr = (options[0] or {}), (options[0] ? params.dup.merge(options[0]) : params)
# either:
# document_url(@document, :action => 'edit', :option1 => 1, :option2 => 2) -- on a document
# document_url(:action => 'new', :option1 => 1) -- on the */documents/:action path
# document_url -- the index, obvioulsy
def document_url(*args)
obj, options = args[0].is_a?(Hash) ? [nil, args[0]] : [args[0], (args[1] or {})]
aggr = params.dup.merge(options)
return case aggr[:document_parent]
when 'Step' then options[:document_id] ?
url(:step_document, aggr[:project_id], aggr[:step], options) :
when 'Step' then obj ?
url(:step_document, aggr[:project_id], aggr[:step], obj.number, obj.current_version.number, options) :
url(:step_documents, aggr[:project_id], aggr[:step], options)
else
raise "no document_url for #{aggr[:document_parent].inspect}"
else
raise "no document_url for #{aggr[:document_parent].inspect}"
end
end

Expand All @@ -48,9 +53,11 @@ def discussion_url(*options)
when 'Step' then
url("step_discussion#{suffix}".to_sym, aggr[:project_id], aggr[:step], options)
when 'StepDocument' then
url("step_document_discussion#{suffix}".to_sym, aggr[:project_id], aggr[:step], aggr[:document_id], options)
url("step_document_discussion#{suffix}".to_sym,
aggr[:project_id], aggr[:step], aggr[:number], aggr[:version], options)
when 'UserDocument' then
url("user_document_discussion#{suffix}".to_sym, aggr[:login], aggr[:document_id], options)
url("user_document_discussion#{suffix}".to_sym,
aggr[:login], aggr[:number], aggr[:version], options)
else
raise "no discussion_url for #{aggr[:discussion_parent].inspect}"
end
Expand Down
15 changes: 12 additions & 3 deletions app/models/discussion.rb
Original file line number Diff line number Diff line change
Expand Up @@ -29,15 +29,24 @@ def root_post_count
end
end


class DocumentDiscussion < Discussion
belongs_to :document
property :document_id, Integer, :unique_index => true
belongs_to :document, :child_key => [:document_id]
validates_present :document
end

class StepDiscussion < Discussion
property :step, Integer
property :project_id, Integer, :unique_index => :step_discussion_handle
property :step_number, Integer, :unique_index => :step_discussion_handle, :length => 10
validates_present :project, :step_number

belongs_to :project
validates_present :project, :step
belongs_to :step, :child_key => [:project_id, :step_number]

# def step
# Step.get(project_id, step)
# end
end

## no project discussion for now, use step discussions to have your say
Expand Down
80 changes: 49 additions & 31 deletions app/models/document.rb
Original file line number Diff line number Diff line change
@@ -1,33 +1,47 @@
# require 'diff/lcs'

# this class is abstract, so never used directly
# use its subclasses instead
class Document
include DataMapper::Resource
after :save, :create_discussion
before :valid?, :set_number
after :save, :create_discussion

attr_reader :current_version, :current_version_number

property :id, Serial
property :created_at, DateTime
property :updated_at, DateTime
property :user_id, Integer, :nullable => false
property :number, Integer, :writer => :private
property :discriminator, Discriminator # because this model is subclassed

# properties for UserDocument (cannot create indices on subclassed models)
property :user_id, Integer, :unique_index => :user_document_handle
property :user_document_number, Integer, :unique_index => :user_document_handle

# properties for UserDocument (cannot create indices on subclassed models)
property :project_id, Integer, :unique_index => :step_document_handle
property :step_number, Integer, :unique_index => :step_document_handle, :length => 10 # cannot be called :step
property :step_document_number, Integer, :unique_index => :step_document_handle

belongs_to :user
has n, :versions, :class_name => 'DocumentVersion', :order => [:number.desc]
has 1, :discussion, :class_name => 'DocumentDiscussion', :child_key => [:document_id]
has 1, :discussion, :class_name => 'DocumentDiscussion'

# def discussion
# DocumentDiscussion.first(:document_id => id)
# end

def version_count
DocumentVersion.count(:document_id => id)
end
# def version_count
# DocumentVersion.count(:document_id => id)
# end

def current_version
get_current_version
end

def version(number)
DocumentVersion.first(:document_id => id, :number => number)
def current_version_number=(n)
get_current_version(n)
end

def diff(from_version, to_version, property = :content_html)
Expand All @@ -37,43 +51,47 @@ def diff(from_version, to_version, property = :content_html)
sdiff = Diff::LCS.sdiff(from_arr, to_arr)
end

private
def context; raise NotImplementedError; end
def number; raise NotImplementedError; end

def get_current_version
# make sure this gets only pulled once from the db
return @current_version if @current_version
@current_version = DocumentVersion.first(:document_id => self.id, :order => [:number.desc])
raise "No current version for document ##{self.id}." unless @current_version
return @current_version
private
def get_current_version(n = nil)
# when n is nil it returns the current, if no current is set it returns the latest version
n ||= @current_version ? @current_version.number : versions.count
# make sure this gets only pulled from the db once
return @current_version if @current_version and @current_version.number == n
@current_version = DocumentVersion.get(id, n) or raise NotFound
end

def create_discussion
raise "Couldn't create StepDicussion" unless DocumentDiscussion.new(:document_id => id).save
raise "Couldn't create DocumentDicussion" unless DocumentDiscussion.new(:document_id => id).save
end

def set_number
self.number = context.documents.count + 1 if number.blank? or new_record?
end
end


class UserDocument < Document
property :published, Boolean # cannot set :nullable => false, so using a validation
belongs_to :user
validates_present :user, :user_document_number, :published

validates_present :published
alias :number :user_document_number
alias :number= :user_document_number=
def context; user; end
end


class StepDocument < Document
property :number, Integer
has n, :votes, :child_key => [:step_document_id]
belongs_to :step1_document, :class_name => 'StepDocument' # foundation documents where applicable
belongs_to :step2_document, :class_name => 'StepDocument'
belongs_to :project
validates_present :number, :project
belongs_to :step, :parent_key => [:project_id, :number], :child_key => [:project_id, :step_number] # WORKS!!
validates_present :user, :project, :step, :step_document_number

def votes
StepDocumentVotes.all(:step_document_id => id)
end

def step
Step.get(:project_id => project_id, :number => discriminator[/\d+/])
end
alias :number :step_document_number
alias :number= :step_document_number=
def context; step; end
end

class Step1Document < StepDocument; end
class Step2Document < StepDocument; end
class Step3Document < StepDocument; end
6 changes: 3 additions & 3 deletions app/models/plan.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@ class Plan
property :step3_document_version, Integer, :nullable => false

belongs_to :project
belongs_to :step1_document
belongs_to :step2_document
belongs_to :step3_document
belongs_to :step1_document, :class_name => 'StepDocument'
belongs_to :step2_document, :class_name => 'StepDocument'
belongs_to :step3_document, :class_name => 'StepDocument'

validates_present :project, :step1_document, :step2_document, :step3_document
# has_unique_documents?
Expand Down
8 changes: 5 additions & 3 deletions app/models/project.rb
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,12 @@ def default_name

private
def create_initial_step
raise "This is not the initial step, but step numer #{in_step}" if [1,2,3].include? in_step # only for 0
return unless in_step == 0 # only for 0
self.in_step = 1
unless Step.new(:project_id => id, :number => in_step).save
raise "Couldn't create step for project ##{id}, this shouldn't happen"
if Step.new(:project_id => id, :number => in_step).save
save # in_step is 1 now...
else
raise "Couldn't create step for project ##{id}"
end
end
end
Loading

0 comments on commit ed7cf2b

Please sign in to comment.