2008-08-04 16:13:51 +02:00
|
|
|
class ProjectsController < ApplicationController
|
|
|
|
|
|
|
|
helper :application, :todos, :notes
|
|
|
|
before_filter :set_source_view
|
2011-09-28 13:54:50 +02:00
|
|
|
before_filter :set_project_from_params, :only => [:update, :destroy, :show, :edit, :set_reviewed]
|
2008-08-04 16:13:51 +02:00
|
|
|
before_filter :default_context_filter, :only => [:create, :update]
|
|
|
|
skip_before_filter :login_required, :only => [:index]
|
|
|
|
prepend_before_filter :login_or_feed_token_required, :only => [:index]
|
|
|
|
|
|
|
|
def index
|
2009-04-18 23:50:12 +02:00
|
|
|
@source_view = params['_source_view'] || 'project_list'
|
2008-08-04 16:13:51 +02:00
|
|
|
if params[:projects_and_actions]
|
|
|
|
projects_and_actions
|
2011-06-26 23:05:33 +02:00
|
|
|
else
|
2012-04-18 14:22:58 +02:00
|
|
|
@contexts = current_user.contexts
|
2011-06-17 20:17:01 +02:00
|
|
|
init_not_done_counts(['project'])
|
|
|
|
init_project_hidden_todo_counts(['project'])
|
2008-08-04 16:13:51 +02:00
|
|
|
if params[:only_active_with_no_next_actions]
|
2011-06-17 20:17:01 +02:00
|
|
|
@projects = current_user.projects.active.select { |p| count_undone_todos(p) == 0 }
|
2011-01-10 22:47:19 +01:00
|
|
|
else
|
2013-05-11 23:13:32 +02:00
|
|
|
@projects = current_user.projects
|
2008-08-04 16:13:51 +02:00
|
|
|
end
|
2012-05-20 05:46:52 +02:00
|
|
|
@active_projects = current_user.projects.active
|
|
|
|
@hidden_projects = current_user.projects.hidden
|
2008-08-04 16:13:51 +02:00
|
|
|
respond_to do |format|
|
2012-05-20 05:46:52 +02:00
|
|
|
format.html do
|
|
|
|
@page_title = t('projects.list_projects')
|
|
|
|
@count = current_user.projects.count
|
|
|
|
@completed_projects = current_user.projects.completed.limit(10)
|
|
|
|
@completed_count = current_user.projects.completed.count
|
|
|
|
@no_projects = current_user.projects.empty?
|
|
|
|
current_user.projects.cache_note_counts
|
2013-05-13 12:50:10 +02:00
|
|
|
@new_project = current_user.projects.build
|
2012-05-20 05:46:52 +02:00
|
|
|
end
|
|
|
|
format.m do
|
|
|
|
@completed_projects = current_user.projects.completed
|
|
|
|
@down_count = @active_projects.size + @hidden_projects.size + @completed_projects.size
|
|
|
|
cookies[:mobile_url]= {:value => request.fullpath, :secure => SITE_CONFIG['secure_cookies']}
|
|
|
|
end
|
2012-06-07 15:55:26 -04:00
|
|
|
format.xml { render :xml => @projects.to_xml( :except => :user_id ) }
|
2013-09-13 14:58:28 +03:00
|
|
|
format.any(:rss, :atom) do
|
2012-04-20 14:38:00 +02:00
|
|
|
@feed_title = I18n.t('models.project.feed_title')
|
|
|
|
@feed_description = I18n.t('models.project.feed_description', :username => current_user.display_name)
|
|
|
|
end
|
2012-05-20 05:46:52 +02:00
|
|
|
format.text do
|
|
|
|
# somehow passing Mime::TEXT using content_type to render does not work
|
|
|
|
headers['Content-Type']=Mime::TEXT.to_s
|
|
|
|
end
|
|
|
|
format.autocomplete do
|
|
|
|
projects = current_user.projects.active + current_user.projects.hidden
|
|
|
|
render :text => for_autocomplete(projects, params[:term])
|
|
|
|
end
|
2008-08-04 16:13:51 +02:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2011-06-26 23:05:33 +02:00
|
|
|
|
2011-09-16 15:07:58 -04:00
|
|
|
def review
|
2012-01-23 12:27:49 +01:00
|
|
|
@source_view = params['_source_view'] || 'review'
|
2011-09-28 13:54:50 +02:00
|
|
|
@page_title = t('projects.list_reviews')
|
2013-05-13 17:13:26 +02:00
|
|
|
@projects = current_user.projects.load
|
|
|
|
@contexts = current_user.contexts.load
|
2011-09-27 08:25:32 -04:00
|
|
|
@projects_to_review = current_user.projects.select {|p| p.needs_review?(current_user)}
|
|
|
|
@stalled_projects = current_user.projects.select {|p| p.stalled?}
|
|
|
|
@blocked_projects = current_user.projects.select {|p| p.blocked?}
|
2011-09-28 15:34:15 +02:00
|
|
|
@current_projects = current_user.projects.uncompleted.select {|p| not(p.needs_review?(current_user))}
|
2011-09-28 13:54:50 +02:00
|
|
|
|
2011-09-16 23:34:09 -04:00
|
|
|
init_not_done_counts(['project'])
|
|
|
|
init_project_hidden_todo_counts(['project'])
|
2011-09-28 13:54:50 +02:00
|
|
|
current_user.projects.cache_note_counts
|
2011-09-16 23:34:09 -04:00
|
|
|
|
|
|
|
@page_title = t('projects.list_reviews')
|
2011-09-27 19:22:14 -04:00
|
|
|
@count = @projects_to_review.count + @blocked_projects.count + @stalled_projects.count + @current_projects.count
|
2011-09-16 23:34:09 -04:00
|
|
|
|
|
|
|
@no_projects = current_user.projects.empty?
|
|
|
|
@new_project = current_user.projects.build
|
2011-09-16 15:07:58 -04:00
|
|
|
end
|
|
|
|
|
2011-06-20 06:50:25 +02:00
|
|
|
def done
|
|
|
|
@source_view = params['_source_view'] || 'project_list'
|
|
|
|
@page_title = t('projects.list_completed_projects')
|
2011-06-26 23:05:33 +02:00
|
|
|
|
2011-06-20 06:50:25 +02:00
|
|
|
page = params[:page] || 1
|
|
|
|
projects_per_page = 20
|
|
|
|
@projects = current_user.projects.completed.paginate :page => page, :per_page => projects_per_page
|
|
|
|
@count = @projects.count
|
|
|
|
@total = current_user.projects.completed.count
|
|
|
|
@no_projects = @projects.empty?
|
2011-06-26 23:05:33 +02:00
|
|
|
|
2011-06-20 06:50:25 +02:00
|
|
|
@range_low = (page.to_i-1) * projects_per_page + 1
|
|
|
|
@range_high = @range_low + @projects.size - 1
|
|
|
|
|
|
|
|
init_not_done_counts(['project'])
|
|
|
|
end
|
2008-08-04 16:13:51 +02:00
|
|
|
|
2011-09-15 00:42:34 -04:00
|
|
|
def set_reviewed
|
2011-09-28 13:54:50 +02:00
|
|
|
@project.last_reviewed = Time.zone.now
|
2011-09-15 20:52:24 -04:00
|
|
|
@project.save
|
2014-08-14 21:05:05 -05:00
|
|
|
|
2012-03-29 16:05:17 +02:00
|
|
|
case @source_view
|
|
|
|
when "project"
|
|
|
|
redirect_to :action => 'show'
|
|
|
|
when "project_list"
|
|
|
|
redirect_to :action => 'index'
|
|
|
|
when "review"
|
|
|
|
redirect_to :action => 'review'
|
|
|
|
else
|
|
|
|
redirect_to :action => 'index'
|
|
|
|
end
|
2011-09-15 00:42:34 -04:00
|
|
|
end
|
|
|
|
|
2008-08-04 16:13:51 +02:00
|
|
|
def projects_and_actions
|
2009-04-18 23:50:12 +02:00
|
|
|
@projects = current_user.projects.active
|
2008-08-04 16:13:51 +02:00
|
|
|
respond_to do |format|
|
2011-06-26 23:05:33 +02:00
|
|
|
format.text {
|
2012-05-20 05:46:52 +02:00
|
|
|
# somehow passing Mime::TEXT using content_type to render does not work
|
|
|
|
headers['Content-Type']=Mime::TEXT.to_s
|
2008-08-04 16:13:51 +02:00
|
|
|
render :action => 'index_text_projects_and_actions', :layout => false, :content_type => Mime::TEXT
|
|
|
|
}
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def show
|
2009-04-18 23:50:12 +02:00
|
|
|
@max_completed = current_user.prefs.show_number_completed
|
2008-08-04 16:13:51 +02:00
|
|
|
init_data_for_sidebar unless mobile?
|
2011-01-16 18:14:07 +01:00
|
|
|
@page_title = t('projects.page_title', :project => @project.name)
|
2011-06-26 23:05:33 +02:00
|
|
|
|
2013-03-05 14:04:01 +01:00
|
|
|
@not_done_todos = @project.todos.active_or_hidden.includes(Todo::DEFAULT_INCLUDES)
|
|
|
|
@deferred_todos = @project.todos.deferred.includes(Todo::DEFAULT_INCLUDES)
|
|
|
|
@pending_todos = @project.todos.pending.includes(Todo::DEFAULT_INCLUDES)
|
2013-06-11 11:12:21 +02:00
|
|
|
@contexts_to_show = current_user.contexts.active
|
|
|
|
@projects_to_show = [@project]
|
2012-02-14 10:16:29 -05:00
|
|
|
|
|
|
|
@done = {}
|
2012-04-18 14:22:58 +02:00
|
|
|
@done = @project.todos.completed.
|
2012-04-24 20:47:07 +02:00
|
|
|
reorder("todos.completed_at DESC").
|
2012-04-18 14:22:58 +02:00
|
|
|
limit(current_user.prefs.show_number_completed).
|
2013-06-11 11:12:21 +02:00
|
|
|
includes(Todo::DEFAULT_INCLUDES) unless @max_completed == 0
|
2009-04-18 23:50:12 +02:00
|
|
|
|
2013-09-18 10:38:20 +02:00
|
|
|
@down_count = @not_done_todos.size + @deferred_todos.size + @pending_todos.size
|
|
|
|
@count=@down_count
|
2008-08-04 16:13:51 +02:00
|
|
|
@next_project = current_user.projects.next_from(@project)
|
|
|
|
@previous_project = current_user.projects.previous_from(@project)
|
2009-10-16 19:15:50 -04:00
|
|
|
@default_tags = @project.default_tags
|
2010-11-29 11:04:15 +01:00
|
|
|
@new_note = current_user.notes.new
|
2010-11-24 22:01:23 +01:00
|
|
|
@new_note.project_id = @project.id
|
2011-02-26 14:20:51 +01:00
|
|
|
@contexts = current_user.contexts
|
2008-08-04 16:13:51 +02:00
|
|
|
respond_to do |format|
|
|
|
|
format.html
|
2012-05-20 05:46:52 +02:00
|
|
|
format.m do
|
|
|
|
if @project.default_context.nil?
|
|
|
|
@project_default_context = t('projects.no_default_context')
|
|
|
|
else
|
|
|
|
@project_default_context = t('projects.default_context', :context => @project.default_context.name)
|
|
|
|
end
|
|
|
|
cookies[:mobile_url]= {:value => request.fullpath, :secure => SITE_CONFIG['secure_cookies']}
|
|
|
|
@mobile_from_project = @project.id
|
|
|
|
end
|
|
|
|
format.xml do
|
2011-10-06 17:32:39 +02:00
|
|
|
render :xml => @project.to_xml(:except => :user_id) { |xml|
|
2013-03-05 14:04:01 +01:00
|
|
|
xml.not_done { @not_done_todos.each { |child| child.to_xml(:builder => xml, :skip_instruct => true) } }
|
|
|
|
xml.deferred { @deferred_todos.each { |child| child.to_xml(:builder => xml, :skip_instruct => true) } }
|
|
|
|
xml.pending { @pending_todos.each { |child| child.to_xml(:builder => xml, :skip_instruct => true) } }
|
2011-10-06 17:32:39 +02:00
|
|
|
xml.done { @done.each { |child| child.to_xml(:builder => xml, :skip_instruct => true) } }
|
|
|
|
}
|
2012-05-20 05:46:52 +02:00
|
|
|
end
|
2008-08-04 16:13:51 +02:00
|
|
|
end
|
|
|
|
end
|
2011-06-26 23:05:33 +02:00
|
|
|
|
2008-08-04 16:13:51 +02:00
|
|
|
def create
|
|
|
|
if params[:format] == 'application/xml' && params['exception']
|
2012-04-27 14:22:16 +02:00
|
|
|
render_failure "Expected post format is valid xml like so: <project><name>project name</name></project>.", 400
|
2008-08-04 16:13:51 +02:00
|
|
|
return
|
|
|
|
end
|
2013-05-27 12:44:31 +02:00
|
|
|
@project = current_user.projects.build(project_params)
|
2008-08-04 16:13:51 +02:00
|
|
|
@go_to_project = params['go_to_project']
|
|
|
|
@saved = @project.save
|
|
|
|
@project_not_done_counts = { @project.id => 0 }
|
2008-11-29 15:35:17 +01:00
|
|
|
@active_projects_count = current_user.projects.active.count
|
2008-08-04 16:13:51 +02:00
|
|
|
@contexts = current_user.contexts
|
2010-10-16 16:45:08 +02:00
|
|
|
|
2008-08-04 16:13:51 +02:00
|
|
|
respond_to do |format|
|
2012-06-29 16:48:30 +02:00
|
|
|
format.js do
|
|
|
|
@down_count = current_user.projects.size
|
|
|
|
init_not_done_counts
|
|
|
|
end
|
2008-08-04 16:13:51 +02:00
|
|
|
format.xml do
|
2012-04-20 14:38:00 +02:00
|
|
|
if @project.new_record?
|
2012-04-27 14:22:16 +02:00
|
|
|
render_failure @project.errors.to_xml.html_safe, 409
|
2008-08-04 16:13:51 +02:00
|
|
|
else
|
2009-08-11 08:53:08 +02:00
|
|
|
head :created, :location => project_url(@project), :text => @project.id
|
2008-08-04 16:13:51 +02:00
|
|
|
end
|
|
|
|
end
|
2010-10-16 16:45:08 +02:00
|
|
|
format.html {redirect_to :action => 'index'}
|
2008-08-04 16:13:51 +02:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
# Edit the details of the project
|
2009-04-18 23:50:12 +02:00
|
|
|
#
|
2008-08-04 16:13:51 +02:00
|
|
|
def update
|
2011-06-10 23:29:42 +02:00
|
|
|
template = ""
|
|
|
|
|
2008-08-04 16:13:51 +02:00
|
|
|
params['project'] ||= {}
|
|
|
|
if params['project']['state']
|
2009-01-24 22:13:19 +01:00
|
|
|
@new_state = params['project']['state']
|
|
|
|
@state_changed = @project.state != @new_state
|
2008-08-04 16:13:51 +02:00
|
|
|
params['project'].delete('state')
|
|
|
|
end
|
|
|
|
success_text = if params['field'] == 'name' && params['value']
|
2011-06-26 23:05:33 +02:00
|
|
|
params['project']['id'] = params['id']
|
|
|
|
params['project']['name'] = params['value']
|
2008-08-04 16:13:51 +02:00
|
|
|
end
|
2010-08-06 10:20:31 +02:00
|
|
|
|
2013-05-27 12:44:31 +02:00
|
|
|
@project.attributes = project_params
|
2010-08-03 20:55:07 +02:00
|
|
|
@saved = @project.save
|
|
|
|
if @saved
|
2009-01-24 22:13:19 +01:00
|
|
|
@project.transition_to(@new_state) if @state_changed
|
2008-08-04 16:13:51 +02:00
|
|
|
if boolean_param('wants_render')
|
|
|
|
@contexts = current_user.contexts
|
2010-10-07 23:24:50 +02:00
|
|
|
update_state_counts
|
2009-10-21 14:45:55 -04:00
|
|
|
init_data_for_sidebar
|
2013-02-20 20:07:31 +01:00
|
|
|
init_project_hidden_todo_counts(['project'])
|
2014-08-14 21:05:05 -05:00
|
|
|
|
2012-05-18 15:33:47 +02:00
|
|
|
template = 'projects/update'
|
2010-10-24 22:31:57 +02:00
|
|
|
|
2012-04-18 16:50:47 +02:00
|
|
|
# TODO: are these params ever set? or is this dead code?
|
2008-08-04 16:13:51 +02:00
|
|
|
elsif boolean_param('update_status')
|
2012-05-18 15:33:47 +02:00
|
|
|
template = 'projects/update_status'
|
2008-08-04 16:13:51 +02:00
|
|
|
elsif boolean_param('update_default_context')
|
2011-06-26 23:05:33 +02:00
|
|
|
@initial_context_name = @project.default_context.name
|
2012-05-18 15:33:47 +02:00
|
|
|
template = 'projects/update_default_context'
|
2009-04-17 18:28:29 +02:00
|
|
|
elsif boolean_param('update_default_tags')
|
2012-05-18 15:33:47 +02:00
|
|
|
template = 'projects/update_default_tags'
|
2008-08-18 16:02:13 +02:00
|
|
|
elsif boolean_param('update_project_name')
|
|
|
|
@projects = current_user.projects
|
2012-05-18 15:33:47 +02:00
|
|
|
template = 'projects/update_project_name'
|
2008-08-04 16:13:51 +02:00
|
|
|
else
|
|
|
|
render :text => success_text || 'Success'
|
|
|
|
return
|
|
|
|
end
|
|
|
|
else
|
2010-08-03 20:55:07 +02:00
|
|
|
init_data_for_sidebar
|
2012-05-18 15:33:47 +02:00
|
|
|
template = 'projects/update'
|
2008-08-04 16:13:51 +02:00
|
|
|
end
|
2011-06-10 23:29:42 +02:00
|
|
|
|
|
|
|
respond_to do |format|
|
|
|
|
format.js { render :template => template }
|
|
|
|
format.html { redirect_to :action => 'index'}
|
2011-06-26 23:05:33 +02:00
|
|
|
format.xml {
|
2011-06-10 23:29:42 +02:00
|
|
|
if @saved
|
2011-06-26 23:05:33 +02:00
|
|
|
render :xml => @project.to_xml( :except => :user_id )
|
2011-06-10 23:29:42 +02:00
|
|
|
else
|
|
|
|
render :text => "Error on update: #{@project.errors.full_messages.inject("") {|v, e| v + e + " " }}", :status => 409
|
|
|
|
end
|
|
|
|
}
|
|
|
|
end
|
2011-06-26 23:05:33 +02:00
|
|
|
|
2008-08-04 16:13:51 +02:00
|
|
|
end
|
2011-06-26 23:05:33 +02:00
|
|
|
|
2008-08-04 16:13:51 +02:00
|
|
|
def edit
|
|
|
|
respond_to do |format|
|
|
|
|
format.js
|
|
|
|
end
|
|
|
|
end
|
2011-06-26 23:05:33 +02:00
|
|
|
|
2008-08-04 16:13:51 +02:00
|
|
|
def destroy
|
2010-04-04 18:20:07 +02:00
|
|
|
@project.recurring_todos.each {|rt| rt.remove_from_project!}
|
2008-08-04 16:13:51 +02:00
|
|
|
@project.destroy
|
2010-10-07 23:24:50 +02:00
|
|
|
|
2008-08-04 16:13:51 +02:00
|
|
|
respond_to do |format|
|
2010-10-07 23:24:50 +02:00
|
|
|
format.js {
|
|
|
|
@down_count = current_user.projects.size
|
|
|
|
update_state_counts
|
|
|
|
}
|
2008-08-04 16:13:51 +02:00
|
|
|
format.xml { render :text => "Deleted project #{@project.name}" }
|
|
|
|
end
|
|
|
|
end
|
2011-06-26 23:05:33 +02:00
|
|
|
|
2008-08-04 16:13:51 +02:00
|
|
|
def order
|
2009-09-25 20:15:34 -04:00
|
|
|
project_ids = params["container_project"]
|
2009-02-05 21:55:33 +01:00
|
|
|
@projects = current_user.projects.update_positions( project_ids )
|
2008-08-04 16:13:51 +02:00
|
|
|
render :nothing => true
|
|
|
|
rescue
|
|
|
|
notify :error, $!
|
|
|
|
redirect_to :action => 'index'
|
|
|
|
end
|
2011-06-26 23:05:33 +02:00
|
|
|
|
2008-08-04 16:13:51 +02:00
|
|
|
def alphabetize
|
|
|
|
@state = params['state']
|
|
|
|
@projects = current_user.projects.alphabetize(:state => @state) if @state
|
|
|
|
@contexts = current_user.contexts
|
2011-06-17 20:17:01 +02:00
|
|
|
init_not_done_counts(['project'])
|
2012-06-27 14:38:03 +02:00
|
|
|
init_project_hidden_todo_counts(['project']) if @state == 'hidden'
|
2008-08-04 16:13:51 +02:00
|
|
|
end
|
2011-06-26 23:05:33 +02:00
|
|
|
|
2008-09-23 17:06:14 -03:00
|
|
|
def actionize
|
|
|
|
@state = params['state']
|
2011-06-12 04:29:35 +02:00
|
|
|
@projects = current_user.projects.actionize(:state => @state) if @state
|
2008-09-23 17:06:14 -03:00
|
|
|
@contexts = current_user.contexts
|
2011-06-17 20:17:01 +02:00
|
|
|
init_not_done_counts(['project'])
|
2012-06-27 14:38:03 +02:00
|
|
|
init_project_hidden_todo_counts(['project']) if @state == 'hidden'
|
2008-09-23 17:06:14 -03:00
|
|
|
end
|
2011-06-26 23:05:33 +02:00
|
|
|
|
2011-06-17 14:30:32 +02:00
|
|
|
def done_todos
|
2013-05-11 10:38:34 +02:00
|
|
|
done_todos_for current_user.projects.find(params[:id])
|
2011-06-17 14:30:32 +02:00
|
|
|
end
|
2011-06-26 23:05:33 +02:00
|
|
|
|
2011-06-17 14:30:32 +02:00
|
|
|
def all_done_todos
|
2013-05-11 10:38:34 +02:00
|
|
|
all_done_todos_for current_user.projects.find(params[:id])
|
2011-06-17 14:30:32 +02:00
|
|
|
end
|
2011-06-26 23:05:33 +02:00
|
|
|
|
2008-08-04 16:13:51 +02:00
|
|
|
protected
|
2010-10-07 23:24:50 +02:00
|
|
|
|
|
|
|
def update_state_counts
|
|
|
|
@active_projects_count = current_user.projects.active.count
|
|
|
|
@hidden_projects_count = current_user.projects.hidden.count
|
|
|
|
@completed_projects_count = current_user.projects.completed.count
|
|
|
|
@show_active_projects = @active_projects_count > 0
|
|
|
|
@show_hidden_projects = @hidden_projects_count > 0
|
|
|
|
@show_completed_projects = @completed_projects_count > 0
|
|
|
|
end
|
2014-08-14 21:05:05 -05:00
|
|
|
|
2008-08-04 16:13:51 +02:00
|
|
|
def set_project_from_params
|
|
|
|
@project = current_user.projects.find_by_params(params)
|
|
|
|
end
|
2011-06-26 23:05:33 +02:00
|
|
|
|
2008-08-04 16:13:51 +02:00
|
|
|
def set_source_view
|
|
|
|
@source_view = params['_source_view'] || 'project'
|
|
|
|
end
|
2011-06-26 23:05:33 +02:00
|
|
|
|
2008-08-04 16:13:51 +02:00
|
|
|
def default_context_filter
|
|
|
|
p = params['project']
|
|
|
|
p = params['request']['project'] if p.nil? && params['request']
|
|
|
|
p = {} if p.nil?
|
|
|
|
default_context_name = p['default_context_name']
|
|
|
|
p.delete('default_context_name')
|
|
|
|
|
2013-09-13 15:40:09 +03:00
|
|
|
if default_context_name.present?
|
2013-02-27 11:50:49 +01:00
|
|
|
default_context = current_user.contexts.where(:name => default_context_name).first_or_create
|
2008-08-04 16:13:51 +02:00
|
|
|
p['default_context_id'] = default_context.id
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2013-05-27 12:44:31 +02:00
|
|
|
private
|
|
|
|
|
|
|
|
def project_params
|
|
|
|
params.require(:project).permit(:name, :position, :user_id, :description, :state, :default_context_id, :default_tags)
|
|
|
|
end
|
|
|
|
|
2009-08-11 08:53:08 +02:00
|
|
|
end
|