get project integrations and login controller tests running

This commit is contained in:
Reinier Balt 2012-04-20 14:38:00 +02:00
parent 59a4d5ede0
commit 96db48dd86
36 changed files with 179 additions and 223 deletions

View file

@ -9,7 +9,6 @@ class ApplicationController < ActionController::Base
protect_from_forgery
helper :application
include LoginSystem
helper_method :current_user, :prefs, :format_date, :markdown
@ -143,14 +142,6 @@ class ApplicationController < ActionController::Base
return json_elems
end
# Uses RedCloth to transform text using either Textile or Markdown Need to
# require redcloth above RedCloth 3.0 or greater is needed to use Markdown,
# otherwise it only handles Textile
#
def markdown(text)
RedCloth.new(text).to_html
end
# Here's the concept behind this "mobile content negotiation" hack: In
# addition to the main, AJAXy Web UI, Tracks has a lightweight low-feature
# 'mobile' version designed to be suitablef or use from a phone or PDA. It
@ -223,7 +214,7 @@ class ApplicationController < ActionController::Base
def redirect_back_or_home
respond_to do |format|
format.html { redirect_back_or_default home_url }
format.html { redirect_back_or_default root_url }
format.m { redirect_back_or_default mobile_url }
end
end

View file

@ -53,7 +53,7 @@ class IntegrationsController < ApplicationController
message = Mail.new(params[:message])
# find user
user = User.where("preferences.sms_email = ?", message.from).includes(:preferences).first
user = User.where("preferences.sms_email = ?", message.from).includes(:preference).first
if user.nil?
render :text => "No user found", :status => 404
return false

View file

@ -27,15 +27,13 @@ class LoginController < ApplicationController
@username = session[:cas_user]
@login_url = CASClient::Frameworks::Rails::Filter.login_url(self)
end
if openid_enabled? && using_open_id?
login_openid
elsif cas_enabled? && session[:cas_user]
if cas_enabled? && session[:cas_user]
login_cas
else
@page_title = "TRACKS::Login"
cookies[:preferred_auth] = prefered_auth? unless cookies[:preferred_auth]
case request.method
when :post
when 'POST'
if @user = User.authenticate(params['user_login'], params['user_password'])
session['user_id'] = @user.id
# If checkbox on login page checked, we don't expire the session after 1 hour
@ -54,7 +52,7 @@ class LoginController < ApplicationController
@login = params['user_login']
notify :warning, t('login.unsuccessful')
end
when :get
when 'GET'
if User.no_users_yet?
redirect_to signup_path
return

View file

@ -9,7 +9,6 @@ class ProjectsController < ApplicationController
def index
@source_view = params['_source_view'] || 'project_list'
@new_project = current_user.projects.build
if params[:projects_and_actions]
projects_and_actions
else
@ -19,15 +18,22 @@ class ProjectsController < ApplicationController
if params[:only_active_with_no_next_actions]
@projects = current_user.projects.active.select { |p| count_undone_todos(p) == 0 }
else
@projects = current_user.projects
@projects = current_user.projects.all
end
@new_project = current_user.projects.build
respond_to do |format|
format.html &render_projects_html
format.m &render_projects_mobile
format.xml { render :xml => @projects.to_xml( :except => :user_id ) }
format.rss &render_rss_feed
format.atom &render_atom_feed
format.text &render_text_feed
format.rss do
@feed_title = I18n.t('models.project.feed_title')
@feed_description = I18n.t('models.project.feed_description', :username => current_user.display_name)
end
format.atom do
@feed_title = I18n.t('models.project.feed_title')
@feed_description = I18n.t('models.project.feed_description', :username => current_user.display_name)
end
format.text
format.autocomplete &render_autocomplete
end
end
@ -144,16 +150,9 @@ class ProjectsController < ApplicationController
render_failure "Expected post format is valid xml like so: <request><project><name>project name</name></project></request>."
return
end
@project = current_user.projects.build
params_are_invalid = true
if (params['project'] || (params['request'] && params['request']['project']))
@project.attributes = params['project'] || params['request']['project']
params_are_invalid = false
end
@project = current_user.projects.build(params['project'])
@go_to_project = params['go_to_project']
@saved = @project.save
@project_not_done_counts = { @project.id => 0 }
@active_projects_count = current_user.projects.active.count
@contexts = current_user.contexts
@ -161,9 +160,7 @@ class ProjectsController < ApplicationController
respond_to do |format|
format.js { @down_count = current_user.projects.size }
format.xml do
if @project.new_record? && params_are_invalid
render_failure "Expected post format is valid xml like so: <request><project><name>project name</name></project></request>."
elsif @project.new_record?
if @project.new_record?
render_failure @project.errors.full_messages.join(', ')
else
head :created, :location => project_url(@project), :text => @project.id
@ -350,33 +347,6 @@ class ProjectsController < ApplicationController
render :action => 'project_mobile'
end
end
def render_rss_feed
lambda do
render_rss_feed_for @projects, :feed => feed_options,
:title => :name,
:item => { :description => lambda { |p| @template.summary(p) } }
end
end
def render_atom_feed
lambda do
render_atom_feed_for @projects, :feed => feed_options,
:item => { :description => lambda { |p| @template.summary(p) },
:title => :name,
:author => lambda { |p| nil } }
end
end
def feed_options
Project.feed_options(current_user)
end
def render_text_feed
lambda do
render :action => 'index', :layout => false, :content_type => Mime::TEXT
end
end
def render_autocomplete
lambda do

View file

@ -75,9 +75,9 @@ module ProjectsHelper
project_description = ''
project_description += Tracks::Utils.render_text( project.description ) unless project.description.blank?
project_description += content_tag(:p,
"#{count_undone_todos_phrase(p)}. " + t('projects.project_state', :state => project.state)
"#{count_undone_todos_phrase(p)}. #{t('projects.project_state', :state => project.state)}".html_safe
)
project_description
raw project_description
end
def needsreview_class(item)

View file

@ -47,13 +47,6 @@ class Project < ActiveRecord::Base
NullProject.new
end
def self.feed_options(user)
{
:title => I18n.t('models.project.feed_title'),
:description => I18n.t('models.project.feed_description', :username => user.display_name)
}
end
def hide_todos
todos.each do |t|
unless t.completed? || t.deferred?

View file

@ -6,13 +6,13 @@ set myUsername to "<%= current_user.login %>"
set myToken to "<%= current_user.token %>"
set myContextID to <%= context.id %> (* <%= context.name %> *)
-- Display dialog to enter your description
-- Display dialog to enter your description
display dialog "<%= t('integrations.applescript_next_action_prompt') %>" default answer ""
set myDesc to text returned of the result
-- Now send all that info to Tracks
-- Edit the URL of your Tracks installation if necessary"
tell application "<%= home_url %>backend/api"
tell application "<%= root_url %>backend/api"
set returnValue to call xmlrpc {method name:"NewTodo", parameters:{myUsername, myToken, myContextID, myDesc}}
end tell

View file

@ -1,10 +1,10 @@
(*
(*
Script to grab the sender and subject of the selected
Mail message(s), and create new next action(s) with description
"Email [sender] about [subject]"
If you have Growl, it pops a notification up with the id of
the newly created action.
the newly created action.
*)
(* Edit appropriately for your setup *)
@ -50,25 +50,25 @@ on importMessage(theMessage)
-- Now send all that info to Tracks
-- Edit the URL of your Tracks installation if necessary"
tell application "<%= home_url %>backend/api"
tell application "<%= root_url %>backend/api"
set returnValue to call xmlrpc {method name:"NewTodo", parameters:{myUsername, myToken, myContextID, myDesc, myNote}}
end tell
(* Growl support - comment out or delete this section if
(* Growl support - comment out or delete this section if
you don't have Growl *)
tell application "GrowlHelperApp"
set the allNotificationsList to ¬
{"Tracks Notification"}
-- Make a list of the notifications
-- that will be enabled by default.
-- Those not enabled by default can be enabled later
-- Make a list of the notifications
-- that will be enabled by default.
-- Those not enabled by default can be enabled later
-- in the 'Applications' tab of the growl prefpane.
set the enabledNotificationsList to ¬
{"Tracks Notification"}
-- Register our script with growl.
-- You can optionally (as here) set a default icon
-- You can optionally (as here) set a default icon
-- for this script's notifications.
register as application ¬
"Tracks Applescript" all notifications allNotificationsList ¬

View file

@ -5,7 +5,7 @@ using terms from application "Quicksilver"
set myToken to "<%= current_user.token %>"
set myContextID to <%= context.id %> (* <%= context.name %> *)
tell application "<%= home_url %>backend/api"
tell application "<%= root_url %>backend/api"
set returnValue to call xmlrpc {method name:"NewTodo", parameters:{myUsername, myToken, myContextID, ThisClipping}}
end tell
tell application "Quicksilver"

View file

@ -1,5 +1,5 @@
<Module>
<ModulePrefs title="Tracks" directory_title="Tracks" description="<%= t('integrations.gmail_description') %>" author="Tracks" author_email="butshesagirl@rousette.org.uk" author_affiliation="Tracks" author_location="UK" title_url="http://www.getontracks.org/" screenshot="http://www.getontracks.org/images/uploads/tracks_home_thumb.png" thumbnail="http://www.getontracks.org/images/uploads/tracks_tickler.png" category="communication" category2="tools" height="300">
</ModulePrefs>
<Content type="url" href="<%= home_url %>mobile"/>
<Content type="url" href="<%= root_url %>mobile"/>
</Module>

View file

@ -90,7 +90,7 @@
<p>If you enter the following entry to your crontab, you will receive email every day around 5 AM with a list of the upcoming actions which are due within the next 7 days.</p>
<textarea id="cron" name="cron">0 5 * * * /usr/bin/curl -0 "<%= home_url %>todos.txt?due=6&token=<%= current_user.token %>" | /usr/bin/mail -e -s 'Tracks actions due in the next 7 days' youremail@yourdomain.com</textarea>
<textarea id="cron" name="cron">0 5 * * * /usr/bin/curl -0 "<%= root_url %>todos.txt?due=6&token=<%= current_user.token %>" | /usr/bin/mail -e -s 'Tracks actions due in the next 7 days' youremail@yourdomain.com</textarea>
<p>You can of course use other text <%= link_to 'feeds provided by Tracks', feeds_path %> -- why not email a list of next actions in a particular project to a group of colleagues who are working on the project?</p>
@ -100,7 +100,7 @@
If Tracks is running on the same server as your mail server, you can use the integrated mail handler built into tracks. Steps to set it up:
</p>
<ul>
<li>Go to <%= link_to t('layouts.navigation.preferences'), preferences_url %>
<li>Go to <%= link_to t('layouts.navigation.preferences'), preferences_url %>
and set your "<%= Preference.human_attribute_name('sms_email') %>" and
"<%= Preference.human_attribute_name('sms_context') %>" for todos sent in
via email (which could come from an SMS message)</li>

View file

@ -15,7 +15,7 @@
<li><a href="#message_gateway">Integrate Tracks with an email server to be able to send an action through email to Tracks</a></li>
<li><a href="#google_gadget">Add Tracks as a Google Gmail gadget</a></li>
</ul><br/>
<p>Do you have one of your own to add?
<p>Do you have one of your own to add?
<a href="http://www.getontracks.org/forums/viewforum/10/" title="Tracks | Tips and Tricks">Tell us about
it in our Tips and Tricks forum</a> and we may include it on this page in a future versions of Tracks.
</p>
@ -90,7 +90,7 @@
<p>If you enter the following entry to your crontab, you will receive email every day around 5 AM with a list of the upcoming actions which are due within the next 7 days.</p>
<textarea id="cron" name="cron">0 5 * * * /usr/bin/curl -0 "<%= home_url %>todos.txt?due=6&token=<%= current_user.token %>" | /usr/bin/mail -e -s 'Tracks actions due in the next 7 days' youremail@yourdomain.com</textarea>
<textarea id="cron" name="cron">0 5 * * * /usr/bin/curl -0 "<%= root_url %>todos.txt?due=6&token=<%= current_user.token %>" | /usr/bin/mail -e -s 'Tracks actions due in the next 7 days' youremail@yourdomain.com</textarea>
<p>You can of course use other text <%= link_to 'feeds provided by Tracks', feeds_path %> -- why not email a list of next actions in a particular project to a group of colleagues who are working on the project?</p>
@ -100,7 +100,7 @@
If Tracks is running on the same server as your mail server, you can use the integrated mail handler built into tracks. Steps to set it up:
</p>
<ul>
<li>Go to <%= link_to t('layouts.navigation.preferences'), preferences_url %> and
<li>Go to <%= link_to t('layouts.navigation.preferences'), preferences_url %> and
set your "<%= Preference.human_attribute_name('sms_email') %>" and
"<%= Preference.human_attribute_name('sms_context') %>" for todos sent in
via email (which could come from an SMS message)</li>

View file

@ -41,7 +41,7 @@
<a name="applescript2-section"> </a>
<h2>Voeg een acties toe met Applescript op basis van de huidig geselecteerde e-mail in Mail.app</h2>
<p>Dit script neemt de verstuurder en het onderwerp van de geselecteerde email(s)
<p>Dit script neemt de verstuurder en het onderwerp van de geselecteerde email(s)
van Mail over en maakt een nieuwe acties voor elke email met de beschrijving
"Email [sender] about [subject]". De beschrijving wordt, als nodig, na 100 karakters afgebroken
(dit is de limiet voor een beschrijving). Het heeft ook Growl notificaties mocht je Growl geïnstalleerd hebben.</p>
@ -93,7 +93,7 @@
<p>Als je de volgende regel toevoegd aan jouw crontab, dat ontvang je een e-mail op elke dag rond 05:00 met een lijst met acties waarvan de deadline afloopt binnen de komende 7 dagen.</p>
<textarea id="cron" name="cron">0 5 * * * /usr/bin/curl -0 "<%= home_url %>todos.txt?due=6&token=<%= current_user.token %>" | /usr/bin/mail -e -s 'Tracks actions due in the next 7 days' youremail@yourdomain.com</textarea>
<textarea id="cron" name="cron">0 5 * * * /usr/bin/curl -0 "<%= root_url %>todos.txt?due=6&token=<%= current_user.token %>" | /usr/bin/mail -e -s 'Tracks actions due in the next 7 days' youremail@yourdomain.com</textarea>
<p>Uiteraard kan je ook een andere <%= link_to 'text feed gebruiken die Tracks biedt', feeds_path %> -- bijvoorbeeld een email met een lijst van acties voor een specifiek project naar een groep collega's die werken aan dat project?</p>
@ -103,7 +103,7 @@
Als Tracks draait op dezelfde server als jouw mailserver, dan kan je de geïntegreerde mail handler gebruiken van Tracks. Om dit in te stellen:
</p>
<ul>
<li>Ga naar <%= link_to t('layouts.navigation.preferences'), preferences_url %>
<li>Ga naar <%= link_to t('layouts.navigation.preferences'), preferences_url %>
en stel in "<%= Preference.human_attribute_name('sms_email') %>" en
"<%= Preference.human_attribute_name('sms_context') %>" voor acties die
verzonden zijn via email (die bijv. komen via een SMS message)</li>
@ -122,7 +122,7 @@
<p>
Je kan nu ook jouw projects/actions beheren in Gmail met de Tracks Gmail Gadget.
Voeg Tracks Gmail gadget toe aan de sidebar van Gmail en volg jouw acties
of voeg een nieuwe actie toe zonder apart een nieuw browser tab/scherm te openen
of voeg een nieuwe actie toe zonder apart een nieuw browser tab/scherm te openen
voor Tracks. Om dit in te stellen:
</p>
<ul>

View file

@ -21,7 +21,7 @@
<pre>
<code>
$ curl -u username:p4ssw0rd -H "Content-Type: text/xml" \
<%= home_url %>contexts.xml
<%= root_url %>contexts.xml
&gt;&gt; &lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;contexts&gt;...&lt;/contexts&gt;
</code>
@ -32,7 +32,7 @@
<pre>
<code>
$ curl -u username:p4ssw0rd -H "Content-Type: text/xml" \
<%= home_url %>contexts/51.xml
<%= root_url %>contexts/51.xml
&gt;&gt; &lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;context&gt;...&lt;/context&gt;
</code>
@ -43,7 +43,7 @@
<pre>
<code>
$ curl -u username:p4ssw0rd -H "Content-Type: text/xml" \
<%= home_url %>contexts/51/todos.xml
<%= root_url %>contexts/51/todos.xml
&gt;&gt; &lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;todos type="array"&gt;...&lt;/todos&gt;
</code>
@ -75,7 +75,7 @@ field to <code>ID, created_at, modified_at, completed_at</code> by adding the pa
<pre>
<code>
$ curl -u username:p4ssw0rd -H "Content-Type: text/xml" \
<%= home_url %>tickler.xml?limit_fields=index
<%= root_url %>tickler.xml?limit_fields=index
</code>
</pre>
@ -89,9 +89,9 @@ field to <code>ID, created_at, modified_at, completed_at</code> by adding the pa
<code>
$ curl -u username:p4ssw0rd -H "Content-Type: text/xml" \
-d "&lt;project&gt;&lt;name&gt;Build a treehouse for the kids&lt;/name&gt;&lt;/project&gt;" \
<%= home_url %>projects.xml -i
<%= root_url %>projects.xml -i
&gt;&gt; HTTP/1.1 201 Created
Location: <%= home_url %>projects/65.xml
Location: <%= root_url %>projects/65.xml
...
</code>
</pre>
@ -102,9 +102,9 @@ Location: <%= home_url %>projects/65.xml
<code>
$ curl -u username:p4ssw0rd -H "Content-Type: text/xml" \
-d "&lt;todo&gt;&lt;description&gt;Model treehouse in SketchUp&lt;/description&gt;&lt;context_id&gt;2&lt;/context_id&gt;&lt;project_id&gt;65&lt;/project_id&gt;&lt;/todo&gt;" \
<%= home_url %>todos.xml -i
<%= root_url %>todos.xml -i
&gt;&gt; HTTP/1.1 201 Created
Location: <%= home_url %>todos/452.xml
Location: <%= root_url %>todos/452.xml
...
</code>
</pre>
@ -115,7 +115,7 @@ Location: <%= home_url %>todos/452.xml
<code>
$ curl -u username:p4ssw0rd -H "Content-Type: text/xml" -X PUT \
-d "&lt;todo&gt;&lt;notes&gt;use maple texture&lt;/notes&gt;&lt;/todos&gt;" \
<%= home_url %>todos/452.xml -i
<%= root_url %>todos/452.xml -i
&gt;&gt; HTTP/1.1 200 OK
...
@ -135,7 +135,7 @@ Location: <%= home_url %>todos/452.xml
<pre>
<code>
$ curl -u username:p4ssw0rd -H "Content-Type: text/xml" -X PUT \
<%= home_url %>todos/452/toggle_check.xml -i
<%= root_url %>todos/452/toggle_check.xml -i
&gt;&gt; HTTP/1.1 200 OK
...
@ -156,7 +156,7 @@ Location: <%= home_url %>todos/452.xml
<pre>
<code>
$ curl -u username:p4ssw0rd -H "Content-Type: text/xml" -X DELETE \
<%= home_url %>todos/452.xml -i
<%= root_url %>todos/452.xml -i
&gt;&gt; HTTP/1.1 200 OK
...
</code>
@ -175,7 +175,7 @@ Location: <%= home_url %>todos/452.xml
<pre>
<code>
$ curl -u username:p4ssw0rd -H "Content-Type: text/xml" \
<%= home_url %>contexts/2/todos.xml
<%= root_url %>contexts/2/todos.xml
&gt;&gt; &lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;nil-classes type="array"/&gt;
@ -192,8 +192,8 @@ $ script/console
Loading development environment (Rails 1.2.4)
&gt;&gt; class Context &lt; ActiveResource::Base; end
=&gt; nil
&gt;&gt; Context.site = "<%= home_url %>"
=&gt; "<%= home_url %>"
&gt;&gt; Context.site = "<%= root_url %>"
=&gt; "<%= root_url %>"
&gt;&gt; Context.site.user = "username"
=&gt; "username"

View file

@ -7,7 +7,7 @@ form_for(note, :html => {
:class => "inline-form edit-note-form"}) do |f|
-%>
<div id="error_status"><%= error_messages_for("note") %></div>
<div id="error_status"><%= get_list_of_error_messages_for(note) %></div>
<%= f.hidden_field( "project_id" ) %>
<%= f.text_area( "body", "cols" => 70, "rows" => 15, "tabindex" => 1 ) %>

View file

@ -7,7 +7,7 @@
<div id="project_new" class="project_new" style="display:block">
<%= form_for(@new_project, :html => {:id => 'project_form',:name=>'project',:class => "inline-form", :method => :post }) do -%>
<div id="error_status"><%= error_messages_for("project") %></div>
<div id="error_status"><%= get_list_of_error_messages_for(@new_project) %></div>
<label for="project_name"><%= Project.human_attribute_name(:name) %>:</label><br />
<%= text_field 'project', 'name', "tabindex" => next_tab_index %><br />

View file

@ -5,7 +5,7 @@
<% end -%>
<div id="project_name" style="width: 100%;"><%= project.name -%></div>
</h2>
<div id="<%= dom_id(project, "container")%>" class="list"><%-# list needs to be here for edit form to work -%>
<div id="<%= dom_id(project, "container")%>" class="list">
<%= render :partial => "projects/project_settings", :object => project, :locals => { :collapsible => collapsible } %>
</div>
</div>
@ -18,4 +18,4 @@
</div>
<%= render :partial => "todos/todo", :collection => @not_done, :locals => { :parent_container_type => "project" } %>
</div>
</div>
</div>

View file

@ -7,7 +7,7 @@ project = project_form
:class => "inline-form edit-project-form",
:method => :put }) do
-%>
<div id="edit_error_status"><%= error_messages_for("project") %></div>
<div id="edit_error_status"><%= get_list_of_error_messages_for(@project) %></div>
<%= source_view_tag( @source_view ) -%>
<label for="project_name">Name:</label><br/>

View file

@ -37,7 +37,7 @@ function update_active_projects_container() {
}
function html_for_error_messages() {
return "<%= escape_javascript(error_messages_for('project')) %>";
return "<%= escape_javascript(get_list_of_error_messages_for(@project)) %>";
}
function html_for_project_listing() {

View file

@ -0,0 +1,12 @@
atom_feed do |feed|
feed.title(@feed_title)
feed.subtitle(@feed_description)
feed.updated(@projects.last.updated_at)
@projects.each do |project|
feed.entry(project) do |entry|
entry.title(h(project.name))
entry.content(project_summary(project), :type => :html)
end
end
end

View file

@ -0,0 +1,20 @@
xml.instruct! :xml, :version => "1.0"
xml.rss :version => "2.0" do
xml.channel do
xml.title @feed_title
xml.description @feed_description
xml.link contexts_url
xml.language 'en-us'
xml.ttl 40
@projects.each do |project|
xml.item do
xml.title h(project.name)
xml.description project_summary(project)
xml.pubDate project.created_at.to_s(:rfc822)
xml.link project_url(project)
xml.guid project_url(project)
end
end
end
end

View file

@ -14,8 +14,7 @@
<div class="add_note_link"><%= link_to t('projects.add_note'), '#' %> </div>
<h2><%= t('projects.notes') %></h2>
<div id="empty-n" style="display:<%= @project.notes.empty? ? 'block' : 'none'%>;">
<%= render :partial => "shared/empty",
:locals => { :message => t('projects.no_notes_attached')} %>
<div class="message"><p><%= t('projects.no_notes_attached') %></p></div>
</div>
<%= render :partial => "notes/notes_summary", :collection => @project.notes %>
</div>
@ -29,5 +28,5 @@
<div id="input_box">
<%= render :partial => "shared/add_new_item_form" %>
<%= render :file => "sidebar/sidebar.html.erb" %>
<%= render :file => "sidebar/sidebar" %>
</div><!-- End of input box -->

View file

@ -1,3 +0,0 @@
<div class="message">
<p><%= message %></p>
</div>