Compare commits
24 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b33ecc41f9 | ||
|
|
78a4a995e6 | ||
|
|
465534a298 | ||
|
|
d5f1bd07b2 | ||
|
|
50863117b8 | ||
|
|
c6693fc78b | ||
|
|
1e01711e3d | ||
|
|
1ab7f6f930 | ||
|
|
f6f7467cdd | ||
|
|
4d0a955d3c | ||
|
|
c45044f13c | ||
|
|
4761e55691 | ||
|
|
af7fb657f4 | ||
|
|
0805ab943e | ||
|
|
9589c0bcad | ||
|
|
91295ea6cd | ||
|
|
d0f4b5aa50 | ||
|
|
008e8d4fbf | ||
|
|
1e50fea55a | ||
|
|
008d38d6b4 | ||
|
|
c61c9e6471 | ||
|
|
e5b5b61d6e | ||
|
|
6a8cdf54b3 | ||
|
|
e43d98a6f5 |
2
.gitignore
vendored
2
.gitignore
vendored
@@ -1,3 +1,5 @@
|
||||
/.project
|
||||
/.loadpath
|
||||
/config/additional_environment.rb
|
||||
/config/database.yml
|
||||
/config/email.yml
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
syntax: glob
|
||||
|
||||
.project
|
||||
.loadpath
|
||||
config/additional_environment.rb
|
||||
config/database.yml
|
||||
config/email.yml
|
||||
|
||||
24
.project
24
.project
@@ -1,24 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>1.1-stable</name>
|
||||
<comment></comment>
|
||||
<projects>
|
||||
</projects>
|
||||
<buildSpec>
|
||||
<buildCommand>
|
||||
<name>org.rubypeople.rdt.core.rubybuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
<buildCommand>
|
||||
<name>com.aptana.ide.core.unifiedBuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
</buildSpec>
|
||||
<natures>
|
||||
<nature>com.aptana.ide.project.nature.web</nature>
|
||||
<nature>org.rubypeople.rdt.core.rubynature</nature>
|
||||
<nature>org.radrails.rails.core.railsnature</nature>
|
||||
</natures>
|
||||
</projectDescription>
|
||||
@@ -23,6 +23,7 @@ class JournalsController < ApplicationController
|
||||
accept_key_auth :index
|
||||
|
||||
helper :issues
|
||||
helper :custom_fields
|
||||
helper :queries
|
||||
include QueriesHelper
|
||||
helper :sort
|
||||
@@ -75,6 +76,14 @@ class JournalsController < ApplicationController
|
||||
format.html { redirect_to :controller => 'issues', :action => 'show', :id => @journal.journalized_id }
|
||||
format.js { render :action => 'update' }
|
||||
end
|
||||
else
|
||||
respond_to do |format|
|
||||
format.html {
|
||||
# TODO: implement non-JS journal update
|
||||
render :nothing => true
|
||||
}
|
||||
format.js
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -123,7 +123,7 @@ class RepositoriesController < ApplicationController
|
||||
(show_error_not_found; return) unless @content
|
||||
if 'raw' == params[:format] || @content.is_binary_data? || (@entry.size && @entry.size > Setting.file_max_size_displayed.to_i.kilobyte)
|
||||
# Force the download
|
||||
send_data @content, :filename => @path.split('/').last
|
||||
send_data @content, :filename => filename_for_content_disposition(@path.split('/').last)
|
||||
else
|
||||
# Prevent empty lines when displaying a file with Windows style eol
|
||||
@content.gsub!("\r\n", "\n")
|
||||
@@ -213,7 +213,7 @@ class RepositoriesController < ApplicationController
|
||||
@rev = params[:rev].blank? ? @repository.default_branch : params[:rev].strip
|
||||
@rev_to = params[:rev_to]
|
||||
|
||||
unless @rev.to_s.match(REV_PARAM_RE) && @rev.to_s.match(REV_PARAM_RE)
|
||||
unless @rev.to_s.match(REV_PARAM_RE) && @rev_to.to_s.match(REV_PARAM_RE)
|
||||
if @repository.branches.blank?
|
||||
raise InvalidRevisionParam
|
||||
end
|
||||
|
||||
@@ -97,11 +97,13 @@ class Changeset < ActiveRecord::Base
|
||||
|
||||
TIMELOG_RE = /
|
||||
(
|
||||
(\d+([.,]\d+)?)h?
|
||||
((\d+)(h|hours?))((\d+)(m|min)?)?
|
||||
|
|
||||
((\d+)(h|hours?|m|min))
|
||||
|
|
||||
(\d+):(\d+)
|
||||
|
|
||||
((\d+)(h|hours?))?((\d+)(m|min)?)?
|
||||
(\d+([\.,]\d+)?)h?
|
||||
)
|
||||
/x
|
||||
|
||||
|
||||
@@ -100,7 +100,7 @@ class MailHandler < ActionMailer::Base
|
||||
elsif m = email.subject.match(MESSAGE_REPLY_SUBJECT_RE)
|
||||
receive_message_reply(m[1].to_i)
|
||||
else
|
||||
receive_issue
|
||||
dispatch_to_default
|
||||
end
|
||||
rescue ActiveRecord::RecordInvalid => e
|
||||
# TODO: send a email to the user
|
||||
@@ -113,6 +113,10 @@ class MailHandler < ActionMailer::Base
|
||||
logger.error "MailHandler: unauthorized attempt from #{user}" if logger
|
||||
false
|
||||
end
|
||||
|
||||
def dispatch_to_default
|
||||
receive_issue
|
||||
end
|
||||
|
||||
# Creates a new issue
|
||||
def receive_issue
|
||||
|
||||
@@ -566,9 +566,19 @@ class Query < ActiveRecord::Base
|
||||
sql = ''
|
||||
case operator
|
||||
when "="
|
||||
sql = "#{db_table}.#{db_field} IN (" + value.collect{|val| "'#{connection.quote_string(val)}'"}.join(",") + ")"
|
||||
if value.any?
|
||||
sql = "#{db_table}.#{db_field} IN (" + value.collect{|val| "'#{connection.quote_string(val)}'"}.join(",") + ")"
|
||||
else
|
||||
# IN an empty set
|
||||
sql = "1=0"
|
||||
end
|
||||
when "!"
|
||||
sql = "(#{db_table}.#{db_field} IS NULL OR #{db_table}.#{db_field} NOT IN (" + value.collect{|val| "'#{connection.quote_string(val)}'"}.join(",") + "))"
|
||||
if value.any?
|
||||
sql = "(#{db_table}.#{db_field} IS NULL OR #{db_table}.#{db_field} NOT IN (" + value.collect{|val| "'#{connection.quote_string(val)}'"}.join(",") + "))"
|
||||
else
|
||||
# NOT IN an empty set
|
||||
sql = "1=1"
|
||||
end
|
||||
when "!*"
|
||||
sql = "#{db_table}.#{db_field} IS NULL"
|
||||
sql << " OR #{db_table}.#{db_field} = ''" if is_custom_filter
|
||||
|
||||
@@ -69,4 +69,5 @@
|
||||
|
||||
<% content_for :header_tags do %>
|
||||
<%= auto_discovery_link_tag(:atom, {:format => 'atom', :key => User.current.rss_key}, :title => "#{@project}: #{@board}") %>
|
||||
<%= stylesheet_link_tag 'scm' %>
|
||||
<% end %>
|
||||
|
||||
@@ -60,7 +60,7 @@ end
|
||||
# Width of the entire chart
|
||||
g_width = (@gantt.date_to - @gantt.date_from + 1)*zoom
|
||||
|
||||
@gantt.render(:top => headers_height + 8, :zoom => zoom, :g_width => g_width)
|
||||
@gantt.render(:top => headers_height + 8, :zoom => zoom, :g_width => g_width, :subject_width => subject_width)
|
||||
|
||||
g_height = [(20 * (@gantt.number_of_rows + 6))+150, 206].max
|
||||
t_height = g_height + headers_height
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
<!-- page specific tags -->
|
||||
<%= yield :header_tags -%>
|
||||
</head>
|
||||
<body class="<%= body_css_classes %>">
|
||||
<body class="<%=h body_css_classes %>">
|
||||
<div id="wrapper">
|
||||
<div id="wrapper2">
|
||||
<div id="top-menu">
|
||||
|
||||
@@ -12,3 +12,7 @@
|
||||
}, :accesskey => accesskey(:preview) %>
|
||||
<% end %>
|
||||
<div id="preview" class="wiki"></div>
|
||||
|
||||
<% content_for :header_tags do %>
|
||||
<%= stylesheet_link_tag 'scm' %>
|
||||
<% end %>
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
|
||||
<p><%= setting_check_box :gravatar_enabled %></p>
|
||||
|
||||
<p><%= setting_select :gravatar_default, [["Wavatars", 'wavatar'], ["Identicons", 'identicon'], ["Monster ids", 'monsterid']], :blank => :label_none %></p>
|
||||
<p><%= setting_select :gravatar_default, [["Wavatars", 'wavatar'], ["Identicons", 'identicon'], ["Monster ids", 'monsterid'], ["Retro", "retro"]], :blank => :label_none %></p>
|
||||
</div>
|
||||
|
||||
<%= submit_tag l(:button_save) %>
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
<td><%= h tracker %></td>
|
||||
<% roles.each do |role, count| -%>
|
||||
<td align="center">
|
||||
<%= link_to((count > 1 ? count : image_tag('false.png')), {:action => 'edit', :role_id => role, :tracker_id => tracker}, :title => l(:button_edit)) %>
|
||||
<%= link_to((count > 0 ? count : image_tag('false.png')), {:action => 'edit', :role_id => role, :tracker_id => tracker}, :title => l(:button_edit)) %>
|
||||
</td>
|
||||
<% end -%>
|
||||
</tr>
|
||||
|
||||
@@ -897,7 +897,7 @@ bg:
|
||||
text_user_wrote: "%{value} написа:"
|
||||
text_enumeration_destroy_question: "%{count} обекта са свързани с тази стойност."
|
||||
text_enumeration_category_reassign_to: 'Пресвържете ги към тази стойност:'
|
||||
text_email_delivery_not_configured: "Изпращането на e-mail-и не е конфигурирано и известията не са разрешени.\nКонфигурирайте вашия SMTP сървър в config/configuration.yml и рестартирайте Redmine, за да ги разрешите."
|
||||
text_email_delivery_not_configured: "Изпращането на e-mail-и не е конфигурирано и известията не са разрешени.\nКонфигурирайте вашия SMTP сървър в config/email.yml и рестартирайте Redmine, за да ги разрешите."
|
||||
text_repository_usernames_mapping: "Изберете или променете потребителите в Redmine, съответстващи на потребителите в дневника на хранилището (repository).\nПотребителите с еднакви имена в Redmine и хранилищата се съвместяват автоматично."
|
||||
text_diff_truncated: '... Този diff не е пълен, понеже е надхвърля максималния размер, който може да бъде показан.'
|
||||
text_custom_field_possible_values_info: 'Една стойност на ред'
|
||||
|
||||
@@ -169,7 +169,7 @@ fr:
|
||||
notice_successful_connection: Connexion réussie.
|
||||
notice_file_not_found: "La page à laquelle vous souhaitez accéder n'existe pas ou a été supprimée."
|
||||
notice_locking_conflict: Les données ont été mises à jour par un autre utilisateur. Mise à jour impossible.
|
||||
notice_not_authorized: "Vous n'êtes pas autorisés à accéder à cette page."
|
||||
notice_not_authorized: "Vous n'êtes pas autorisé à accéder à cette page."
|
||||
notice_not_authorized_archived_project: Le projet auquel vous tentez d'accéder a été archivé.
|
||||
notice_email_sent: "Un email a été envoyé à %{value}"
|
||||
notice_email_error: "Erreur lors de l'envoi de l'email (%{value})"
|
||||
@@ -323,11 +323,11 @@ fr:
|
||||
setting_text_formatting: Formatage du texte
|
||||
setting_wiki_compression: Compression historique wiki
|
||||
setting_feeds_limit: Limite du contenu des flux RSS
|
||||
setting_default_projects_public: Définir les nouveaux projects comme publics par défaut
|
||||
setting_default_projects_public: Définir les nouveaux projets comme publics par défaut
|
||||
setting_autofetch_changesets: Récupération auto. des commits
|
||||
setting_sys_api_enabled: Activer les WS pour la gestion des dépôts
|
||||
setting_commit_ref_keywords: Mot-clés de référencement
|
||||
setting_commit_fix_keywords: Mot-clés de résolution
|
||||
setting_commit_ref_keywords: Mots-clés de référencement
|
||||
setting_commit_fix_keywords: Mots-clés de résolution
|
||||
setting_autologin: Autologin
|
||||
setting_date_format: Format de date
|
||||
setting_time_format: Format d'heure
|
||||
@@ -349,7 +349,7 @@ fr:
|
||||
setting_gravatar_enabled: Afficher les Gravatar des utilisateurs
|
||||
setting_diff_max_lines_displayed: Nombre maximum de lignes de diff affichées
|
||||
setting_file_max_size_displayed: Taille maximum des fichiers texte affichés en ligne
|
||||
setting_repository_log_display_limit: "Nombre maximum de revisions affichées sur l'historique d'un fichier"
|
||||
setting_repository_log_display_limit: "Nombre maximum de révisions affichées sur l'historique d'un fichier"
|
||||
setting_openid: "Autoriser l'authentification et l'enregistrement OpenID"
|
||||
setting_password_min_length: Longueur minimum des mots de passe
|
||||
setting_new_project_user_role_id: Rôle donné à un utilisateur non-administrateur qui crée un projet
|
||||
@@ -369,7 +369,7 @@ fr:
|
||||
permission_add_subprojects: Créer des sous-projets
|
||||
permission_edit_project: Modifier le projet
|
||||
permission_select_project_modules: Choisir les modules
|
||||
permission_manage_members: Gérer les members
|
||||
permission_manage_members: Gérer les membres
|
||||
permission_manage_versions: Gérer les versions
|
||||
permission_manage_categories: Gérer les catégories de demandes
|
||||
permission_view_issues: Voir les demandes
|
||||
@@ -859,7 +859,7 @@ fr:
|
||||
text_issue_added: "La demande %{id} a été soumise par %{author}."
|
||||
text_issue_updated: "La demande %{id} a été mise à jour par %{author}."
|
||||
text_wiki_destroy_confirmation: Etes-vous sûr de vouloir supprimer ce wiki et tout son contenu ?
|
||||
text_issue_category_destroy_question: "%{count} demandes sont affectées à cette catégories. Que voulez-vous faire ?"
|
||||
text_issue_category_destroy_question: "%{count} demandes sont affectées à cette catégorie. Que voulez-vous faire ?"
|
||||
text_issue_category_destroy_assignments: N'affecter les demandes à aucune autre catégorie
|
||||
text_issue_category_reassign_to: Réaffecter les demandes à cette catégorie
|
||||
text_user_mail_option: "Pour les projets non sélectionnés, vous recevrez seulement des notifications pour ce que vous surveillez ou à quoi vous participez (exemple: demandes dont vous êtes l'auteur ou la personne assignée)."
|
||||
|
||||
@@ -5,25 +5,25 @@ nl:
|
||||
# Use the strftime parameters for formats.
|
||||
# When no format has been given, it uses default.
|
||||
# You can provide other formats here if you like!
|
||||
default: "%Y-%m-%d"
|
||||
short: "%b %d"
|
||||
long: "%B %d, %Y"
|
||||
default: "%d-%m-%Y"
|
||||
short: "%e %b"
|
||||
long: "%d %B, %Y"
|
||||
|
||||
day_names: [Zondag, Maandag, Dinsdag, Woensdag, Donderdag, Vrijdag, Zaterdag]
|
||||
abbr_day_names: [Zo, Ma, Di, Woe, Do, Vr, Zat]
|
||||
day_names: [zondag, maandag, dinsdag, woensdag, donderdag, vrijdag, zaterdag]
|
||||
abbr_day_names: [zo, ma, di, wo, do, vr, za]
|
||||
|
||||
# Don't forget the nil at the beginning; there's no such thing as a 0th month
|
||||
month_names: [~, Januari, Februari, Maart, April, Mei, Juni, Juli, Augustus, September, Oktober, November, December]
|
||||
abbr_month_names: [~, Jan, Feb, Mar, Apr, Mei, Jun, Jul, Aug, Sep, Okt, Nov, Dec]
|
||||
month_names: [~, januari, februari, maart, april, mei, juni, juli, augustus, september, oktober, november, december]
|
||||
abbr_month_names: [~, jan, feb, mar, apr, mei, jun, jul, aug, sep, okt, nov, dec]
|
||||
# Used in date_select and datime_select.
|
||||
order: [ :year, :month, :day ]
|
||||
order: [ :day, :month, :year ]
|
||||
|
||||
time:
|
||||
formats:
|
||||
default: "%a, %d %b %Y %H:%M:%S %z"
|
||||
time: "%H:%M"
|
||||
short: "%d %b %H:%M"
|
||||
long: "%B %d, %Y %H:%M"
|
||||
short: "%e %b %H:%M"
|
||||
long: "%d %B, %Y %H:%M"
|
||||
am: "am"
|
||||
pm: "pm"
|
||||
|
||||
@@ -32,7 +32,7 @@ nl:
|
||||
half_a_minute: "halve minuut"
|
||||
less_than_x_seconds:
|
||||
one: "minder dan een seconde"
|
||||
other: "mindera dan %{count} seconden"
|
||||
other: "minder dan %{count} seconden"
|
||||
x_seconds:
|
||||
one: "1 seconde"
|
||||
other: "%{count} seconden"
|
||||
@@ -56,13 +56,13 @@ nl:
|
||||
other: "%{count} maanden"
|
||||
about_x_years:
|
||||
one: "ongeveer 1 jaar"
|
||||
other: "ongeveer %{count} jaren"
|
||||
other: "ongeveer %{count} jaar"
|
||||
over_x_years:
|
||||
one: "over 1 jaar"
|
||||
other: "over %{count} jaren"
|
||||
one: "meer dan 1 jaar"
|
||||
other: "meer dan %{count} jaar"
|
||||
almost_x_years:
|
||||
one: "almost 1 year"
|
||||
other: "almost %{count} years"
|
||||
one: "bijna 1 jaar"
|
||||
other: "bijna %{count} jaar"
|
||||
|
||||
number:
|
||||
format:
|
||||
@@ -94,8 +94,8 @@ nl:
|
||||
errors:
|
||||
template:
|
||||
header:
|
||||
one: "1 error prohibited this %{model} from being saved"
|
||||
other: "%{count} errors prohibited this %{model} from being saved"
|
||||
one: "Door een fout kon dit %{model} niet worden opgeslagen"
|
||||
other: "Door %{count} fouten kon dit %{model} niet worden opgeslagen"
|
||||
messages:
|
||||
inclusion: "staat niet in de lijst"
|
||||
exclusion: "is gereserveerd"
|
||||
@@ -143,7 +143,7 @@ nl:
|
||||
button_edit: Bewerk
|
||||
button_list: Lijst
|
||||
button_lock: Sluit
|
||||
button_log_time: Log tijd
|
||||
button_log_time: Registreer tijd
|
||||
button_login: Inloggen
|
||||
button_move: Verplaatsen
|
||||
button_quote: Citaat
|
||||
@@ -513,9 +513,9 @@ nl:
|
||||
one: 1 project
|
||||
other: "%{count} projects"
|
||||
label_public_projects: Publieke projecten
|
||||
label_query: Eigen zoekvraag
|
||||
label_query_new: Nieuwe zoekvraag
|
||||
label_query_plural: Eigen zoekvragen
|
||||
label_query: Eigen zoekopdracht
|
||||
label_query_new: Nieuwe zoekopdracht
|
||||
label_query_plural: Eigen zoekopdrachten
|
||||
label_read: Lees...
|
||||
label_register: Registreer
|
||||
label_registered_on: Geregistreerd op
|
||||
@@ -581,7 +581,7 @@ nl:
|
||||
label_used_by: Gebruikt door
|
||||
label_user: Gebruiker
|
||||
label_user_activity: "%{value}'s activiteit"
|
||||
label_user_mail_no_self_notified: "Ik wil niet op de hoogte gehouden worden van wijzigingen die ik zelf maak."
|
||||
label_user_mail_no_self_notified: Ik wil niet op de hoogte gehouden worden van mijn eigen wijzigingen
|
||||
label_user_mail_option_all: "Bij elk gebeurtenis in al mijn projecten..."
|
||||
label_user_mail_option_selected: "Enkel bij elke gebeurtenis op het geselecteerde project..."
|
||||
label_user_new: Nieuwe gebruiker
|
||||
@@ -718,7 +718,7 @@ nl:
|
||||
setting_mail_from: Afzender e-mail adres
|
||||
setting_mail_handler_api_enabled: Schakel WS in voor inkomende mail.
|
||||
setting_mail_handler_api_key: API sleutel
|
||||
setting_per_page_options: Objects per pagina-opties
|
||||
setting_per_page_options: Aantal objecten per pagina (opties)
|
||||
setting_plain_text_mail: platte tekst (geen HTML)
|
||||
setting_protocol: Protocol
|
||||
setting_repositories_encodings: Repositories coderingen
|
||||
@@ -773,7 +773,7 @@ nl:
|
||||
text_tip_issue_end_day: issue die op deze dag eindigt
|
||||
text_tracker_no_workflow: Geen workflow gedefinieerd voor deze tracker
|
||||
text_unallowed_characters: Niet toegestane tekens
|
||||
text_user_mail_option: "Bij niet-geselecteerde projecten zult u enkel notificaties ontvangen voor issues die u monitort of waar u bij betrokken bent (als auteur of toegewezen persoon)."
|
||||
text_user_mail_option: "Bij niet-geselecteerde projecten zult u enkel mededelingen ontvangen voor issues die u monitort of waar u bij betrokken bent (als auteur of toegewezen persoon)."
|
||||
text_user_wrote: "%{value} schreef:"
|
||||
text_wiki_destroy_confirmation: Weet u zeker dat u deze wiki en zijn inhoud wenst te verwijderen?
|
||||
text_workflow_edit: Selecteer een rol en een tracker om de workflow te wijzigen
|
||||
@@ -795,7 +795,7 @@ nl:
|
||||
label_date_from_to: Van %{start} tot %{end}
|
||||
label_greater_or_equal: ">="
|
||||
label_less_or_equal: <=
|
||||
text_wiki_page_destroy_question: Deze pagina heeft %{descendants} subpagina's en onderliggende pagina's?. Wil wil je ermee doen?
|
||||
text_wiki_page_destroy_question: Deze pagina heeft %{descendants} subpagina's en onderliggende pagina's?. Wat wilt u hiermee doen?
|
||||
text_wiki_page_reassign_children: Alle subpagina's toewijzen aan deze hoofdpagina
|
||||
text_wiki_page_nullify_children: Behoud subpagina's als hoofdpagina's
|
||||
text_wiki_page_destroy_children: Verwijder alle subpagina's en onderliggende pagina's
|
||||
@@ -804,9 +804,9 @@ nl:
|
||||
mail_subject_wiki_content_updated: "'%{id}' wiki pagina is bijgewerkt"
|
||||
label_wiki_content_added: Wiki pagina toegevoegd
|
||||
mail_subject_wiki_content_added: "'%{id}' wiki pagina is toegevoegd"
|
||||
mail_body_wiki_content_added: The '%{id}' wiki pagina is toegevoegd door %{author}.
|
||||
mail_body_wiki_content_added: De '%{id}' wiki pagina is toegevoegd door %{author}.
|
||||
label_wiki_content_updated: Wiki pagina bijgewerkt
|
||||
mail_body_wiki_content_updated: The '%{id}' wiki pagina is bijgewerkt door %{author}.
|
||||
mail_body_wiki_content_updated: De '%{id}' wiki pagina is bijgewerkt door %{author}.
|
||||
permission_add_project: Maak project
|
||||
setting_new_project_user_role_id: Rol van gebruiker die een project maakt
|
||||
label_view_all_revisions: Bekijk alle revisies
|
||||
@@ -895,26 +895,26 @@ nl:
|
||||
text_zoom_in: Zoom in
|
||||
notice_unable_delete_time_entry: Verwijderen niet mogelijk van tijd log invoer.
|
||||
label_overall_spent_time: Totaal bestede tijd
|
||||
field_time_entries: Log tijd
|
||||
field_time_entries: Registreer tijd
|
||||
project_module_gantt: Gantt
|
||||
project_module_calendar: Kalender
|
||||
button_edit_associated_wikipage: "Edit associated Wiki page: %{page_title}"
|
||||
text_are_you_sure_with_children: Delete issue and all child issues?
|
||||
field_text: Text field
|
||||
label_user_mail_option_only_owner: Only for things I am the owner of
|
||||
setting_default_notification_option: Default notification option
|
||||
label_user_mail_option_only_my_events: Only for things I watch or I'm involved in
|
||||
label_user_mail_option_only_assigned: Only for things I am assigned to
|
||||
label_user_mail_option_none: No events
|
||||
button_edit_associated_wikipage: "Bewerk bijbehorende wiki pagina: %{page_title}"
|
||||
text_are_you_sure_with_children: Verwijder issue en alle onderliggende issues?
|
||||
field_text: Tekst veld
|
||||
label_user_mail_option_only_owner: Alleen voor dingen waarvan ik de auteur ben
|
||||
setting_default_notification_option: Standaard instelling voor mededelingen
|
||||
label_user_mail_option_only_my_events: Alleen voor dingen die ik volg of bij betrokken ben
|
||||
label_user_mail_option_only_assigned: Alleen voor dingen die aan mij zijn toegewezen
|
||||
label_user_mail_option_none: Bij geen enkele gebeurtenis
|
||||
field_member_of_group: Assignee's group
|
||||
field_assigned_to_role: Assignee's role
|
||||
notice_not_authorized_archived_project: The project you're trying to access has been archived.
|
||||
label_principal_search: "Search for user or group:"
|
||||
label_user_search: "Search for user:"
|
||||
field_visible: Visible
|
||||
notice_not_authorized_archived_project: Het project dat u wilt bezoeken is gearchiveerd.
|
||||
label_principal_search: "Zoek naar gebruiker of groep:"
|
||||
label_user_search: "Zoek naar gebruiker:"
|
||||
field_visible: Zichtbaar
|
||||
setting_emails_header: Emails header
|
||||
setting_commit_logtime_activity_id: Activity for logged time
|
||||
text_time_logged_by_changeset: Applied in changeset %{value}.
|
||||
setting_commit_logtime_enabled: Enable time logging
|
||||
notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
|
||||
setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
|
||||
setting_commit_logtime_activity_id: Standaard activiteit voor tijdregistratie
|
||||
text_time_logged_by_changeset: Toegepast in changeset %{value}.
|
||||
setting_commit_logtime_enabled: Activeer tijdregistratie
|
||||
notice_gantt_chart_truncated: De gantt chart is ingekort omdat het meer objecten bevat dan kan worden weergegeven, (%{max})
|
||||
setting_gantt_items_limit: Max. aantal objecten op gantt chart
|
||||
|
||||
@@ -315,7 +315,7 @@ pt-BR:
|
||||
setting_issue_list_default_columns: Colunas padrão visíveis na lista de tarefas
|
||||
setting_repositories_encodings: Codificação dos repositórios
|
||||
setting_commit_logs_encoding: Codificação das mensagens de commit
|
||||
setting_emails_footer: Rodapé dos e-mails
|
||||
setting_emails_footer: Rodapé do e-mail
|
||||
setting_protocol: Protocolo
|
||||
setting_per_page_options: Número de itens exibidos por página
|
||||
setting_user_format: Formato de exibição de nome de usuário
|
||||
@@ -354,6 +354,9 @@ pt-BR:
|
||||
label_issues_by: "Tarefas por %{value}"
|
||||
label_issue_added: Tarefa adicionada
|
||||
label_issue_updated: Tarefa atualizada
|
||||
label_issue_note_added: Nota adicionada
|
||||
label_issue_status_updated: Situação atualizada
|
||||
label_issue_priority_updated: Prioridade atualizada
|
||||
label_document: Documento
|
||||
label_document_new: Novo documento
|
||||
label_document_plural: Documentos
|
||||
@@ -557,7 +560,7 @@ pt-BR:
|
||||
label_spent_time: Tempo gasto
|
||||
label_f_hour: "%{value} hora"
|
||||
label_f_hour_plural: "%{value} horas"
|
||||
label_time_tracking: Controle de horas
|
||||
label_time_tracking: Registro de horas
|
||||
label_change_plural: Alterações
|
||||
label_statistics: Estatísticas
|
||||
label_commits_per_month: Commits por mês
|
||||
@@ -754,7 +757,7 @@ pt-BR:
|
||||
|
||||
enumeration_issue_priorities: Prioridade das tarefas
|
||||
enumeration_doc_categories: Categorias de documento
|
||||
enumeration_activities: Atividades (time tracking)
|
||||
enumeration_activities: Atividades (registro de horas)
|
||||
notice_unable_delete_version: Não foi possível excluir a versão
|
||||
label_renamed: renomeado
|
||||
label_copied: copiado
|
||||
@@ -943,16 +946,16 @@ pt-BR:
|
||||
setting_default_notification_option: Opção padrão de notificação
|
||||
label_user_mail_option_only_my_events: Somente para as coisas que eu esteja observando ou esteja envolvido
|
||||
label_user_mail_option_only_assigned: Somente para as coisas que estejam atribuídas a mim
|
||||
label_user_mail_option_none: No events
|
||||
field_member_of_group: Assignee's group
|
||||
field_assigned_to_role: Assignee's role
|
||||
notice_not_authorized_archived_project: The project you're trying to access has been archived.
|
||||
label_principal_search: "Search for user or group:"
|
||||
label_user_search: "Search for user:"
|
||||
field_visible: Visible
|
||||
setting_emails_header: Emails header
|
||||
setting_commit_logtime_activity_id: Activity for logged time
|
||||
text_time_logged_by_changeset: Applied in changeset %{value}.
|
||||
setting_commit_logtime_enabled: Enable time logging
|
||||
notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
|
||||
setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
|
||||
label_user_mail_option_none: Sem eventos
|
||||
field_member_of_group: Grupo do responsável
|
||||
field_assigned_to_role: Papel do responsável
|
||||
notice_not_authorized_archived_project: O projeto que você está tentando acessar foi arquivado.
|
||||
label_principal_search: "Pesquisar por usuários ou grupos:"
|
||||
label_user_search: "Pesquisar por usuário:"
|
||||
field_visible: Visível
|
||||
setting_emails_header: Cabeçalho do e-mail
|
||||
setting_commit_logtime_activity_id: Atividade para registrar horas
|
||||
text_time_logged_by_changeset: Aplicado no changeset %{value}.
|
||||
setting_commit_logtime_enabled: Habilitar registro de horas
|
||||
notice_gantt_chart_truncated: O gráfico foi cortado por exceder o tamanho máximo de linhas que podem ser exibidas (%{max})
|
||||
setting_gantt_items_limit: Número máximo de itens exibidos no gráfico gatt
|
||||
|
||||
@@ -4,6 +4,24 @@ Redmine - project management software
|
||||
Copyright (C) 2006-2011 Jean-Philippe Lang
|
||||
http://www.redmine.org/
|
||||
|
||||
== 2011-03-07 v1.1.2
|
||||
|
||||
* Defect #3132: Bulk editing menu non-functional in Opera browser
|
||||
* Defect #6090: Most binary files become corrupted when downloading from CVS repository browser when Redmine is running on a Windows server
|
||||
* Defect #7280: Issues subjects wrap in Gantt
|
||||
* Defect #7288: Non ASCII filename downloaded from repo is broken on Internet Explorer.
|
||||
* Defect #7317: Gantt tab gives internal error due to nil avatar icon
|
||||
* Defect #7497: Aptana Studio .project file added to version 1.1.1-stable
|
||||
* Defect #7611: Workflow summary shows X icon for workflow with exactly 1 status transition
|
||||
* Defect #7625: Syntax highlighting unavailable from board new topic or topic edit preview
|
||||
* Defect #7630: Spent time in commits not recognized
|
||||
* Defect #7656: MySQL SQL Syntax Error when filtering issues by Assignee's Group
|
||||
* Defect #7718: Minutes logged in commit message are converted to hours
|
||||
* Defect #7763: Email notification are sent to watchers even if 'No events' setting is chosen
|
||||
* Feature #7608: Add "retro" gravatars
|
||||
* Patch #7598: Extensible MailHandler
|
||||
* Patch #7795: Internal server error at journals#index with custom fields
|
||||
|
||||
== 2011-01-30 v1.1.1
|
||||
|
||||
* Defect #4899: Redmine fails to list files for darcs repository
|
||||
|
||||
@@ -353,11 +353,11 @@ module Redmine
|
||||
subject = "<span class='#{css_classes}'>"
|
||||
if issue.assigned_to.present?
|
||||
assigned_string = l(:field_assigned_to) + ": " + issue.assigned_to.name
|
||||
subject << view.avatar(issue.assigned_to, :class => 'gravatar icon-gravatar', :size => 10, :title => assigned_string)
|
||||
subject << view.avatar(issue.assigned_to, :class => 'gravatar icon-gravatar', :size => 10, :title => assigned_string).to_s
|
||||
end
|
||||
subject << view.link_to_issue(issue)
|
||||
subject << '</span>'
|
||||
html_subject(options, subject, :css => "issue-subject") + "\n"
|
||||
html_subject(options, subject, :css => "issue-subject", :title => issue.subject) + "\n"
|
||||
when :image
|
||||
image_subject(options, issue.subject)
|
||||
when :pdf
|
||||
@@ -709,9 +709,10 @@ module Redmine
|
||||
end
|
||||
|
||||
def html_subject(params, subject, options={})
|
||||
output = "<div class=' #{options[:css] }' style='position: absolute;line-height:1.2em;height:16px;top:#{params[:top]}px;left:#{params[:indent]}px;overflow:hidden;'>"
|
||||
output << subject
|
||||
output << "</div>"
|
||||
style = "position: absolute;top:#{params[:top]}px;left:#{params[:indent]}px;"
|
||||
style << "width:#{params[:subject_width] - params[:indent]}px;" if params[:subject_width]
|
||||
|
||||
output = view.content_tag 'div', subject, :class => options[:css], :style => style, :title => options[:title]
|
||||
@subjects << output
|
||||
output
|
||||
end
|
||||
|
||||
@@ -249,6 +249,7 @@ module Redmine
|
||||
cmd << " -p #{shell_quote path_with_project}"
|
||||
cat = nil
|
||||
shellout(cmd) do |io|
|
||||
io.binmode
|
||||
cat = io.read
|
||||
end
|
||||
return nil if $? && $?.exitstatus != 0
|
||||
|
||||
@@ -4,7 +4,7 @@ module Redmine
|
||||
module VERSION #:nodoc:
|
||||
MAJOR = 1
|
||||
MINOR = 1
|
||||
TINY = 1
|
||||
TINY = 2
|
||||
|
||||
# Branch values:
|
||||
# * official release: nil
|
||||
|
||||
@@ -1,3 +1,10 @@
|
||||
desc 'Updates and checks locales against en.yml'
|
||||
task :locales do
|
||||
%w(locales:update locales:check_interpolation).collect do |task|
|
||||
Rake::Task[task].invoke
|
||||
end
|
||||
end
|
||||
|
||||
namespace :locales do
|
||||
desc 'Updates language files based on en.yml content (only works for new top level keys).'
|
||||
task :update do
|
||||
@@ -28,6 +35,26 @@ namespace :locales do
|
||||
lang.close
|
||||
end
|
||||
end
|
||||
|
||||
desc 'Checks interpolation arguments in locals against en.yml'
|
||||
task :check_interpolation do
|
||||
dir = ENV['DIR'] || './config/locales'
|
||||
en_strings = YAML.load(File.read(File.join(dir,'en.yml')))['en']
|
||||
files = Dir.glob(File.join(dir,'*.{yaml,yml}'))
|
||||
files.each do |file|
|
||||
file_strings = YAML.load(File.read(file))
|
||||
file_strings = file_strings[file_strings.keys.first]
|
||||
|
||||
file_strings.each do |key, string|
|
||||
next unless string.is_a?(String)
|
||||
string.scan /%\{\w+\}/ do |match|
|
||||
unless en_strings[key].nil? || en_strings[key].include?(match)
|
||||
puts "#{file}: #{key} uses #{match} not found in en.yml"
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
desc <<-END_DESC
|
||||
Removes a translation string from all locale file (only works for top-level childless non-multiline keys, probably doesn\'t work on windows).
|
||||
|
||||
@@ -11,7 +11,7 @@ ContextMenu.prototype = {
|
||||
|
||||
if (!observingContextMenuClick) {
|
||||
Event.observe(document, 'click', this.Click.bindAsEventListener(this));
|
||||
Event.observe(document, (window.opera ? 'click' : 'contextmenu'), this.RightClick.bindAsEventListener(this));
|
||||
Event.observe(document, 'contextmenu', this.RightClick.bindAsEventListener(this));
|
||||
observingContextMenuClick = true;
|
||||
}
|
||||
|
||||
@@ -23,8 +23,6 @@ ContextMenu.prototype = {
|
||||
this.hideMenu();
|
||||
// do not show the context menu on links
|
||||
if (Event.element(e).tagName == 'A') { return; }
|
||||
// right-click simulated by Alt+Click with Opera
|
||||
if (window.opera && !e.altKey) { return; }
|
||||
var tr = Event.findElement(e, 'tr');
|
||||
if (tr == document || tr == undefined || !tr.hasClassName('hascontextmenu')) { return; }
|
||||
Event.stop(e);
|
||||
@@ -39,7 +37,6 @@ ContextMenu.prototype = {
|
||||
Click: function(e) {
|
||||
this.hideMenu();
|
||||
if (Event.element(e).tagName == 'A') { return; }
|
||||
if (window.opera && e.altKey) { return; }
|
||||
if (Event.isLeftClick(e) || (navigator.appVersion.match(/\bMSIE\b/))) {
|
||||
var tr = Event.findElement(e, 'tr');
|
||||
if (tr!=null && tr!=document && tr.hasClassName('hascontextmenu')) {
|
||||
|
||||
@@ -783,6 +783,7 @@ background-image:url('../images/close_hl.png');
|
||||
}
|
||||
|
||||
.gantt_subjects { font-size: 0.8em; }
|
||||
.gantt_subjects div { line-height:1.2em;height:16px;overflow:hidden;white-space:nowrap;text-overflow: ellipsis; }
|
||||
|
||||
.task {
|
||||
position: absolute;
|
||||
|
||||
7
test/fixtures/journal_details.yml
vendored
7
test/fixtures/journal_details.yml
vendored
@@ -20,3 +20,10 @@ journal_details_003:
|
||||
value: "6"
|
||||
prop_key: fixed_version_id
|
||||
journal_id: 4
|
||||
journal_details_005:
|
||||
old_value: Old value
|
||||
property: cf
|
||||
id: 5
|
||||
value: New value
|
||||
prop_key: 2
|
||||
journal_id: 3
|
||||
|
||||
@@ -22,7 +22,8 @@ require 'journals_controller'
|
||||
class JournalsController; def rescue_action(e) raise e end; end
|
||||
|
||||
class JournalsControllerTest < ActionController::TestCase
|
||||
fixtures :projects, :users, :members, :member_roles, :roles, :issues, :journals, :journal_details, :enabled_modules
|
||||
fixtures :projects, :users, :members, :member_roles, :roles, :issues, :journals, :journal_details, :enabled_modules,
|
||||
:trackers, :issue_statuses, :enumerations, :custom_fields, :custom_values, :custom_fields_projects
|
||||
|
||||
def setup
|
||||
@controller = JournalsController.new
|
||||
|
||||
@@ -172,6 +172,12 @@ class RepositoriesSubversionControllerTest < ActionController::TestCase
|
||||
assert_error_tag :content => /was not found/
|
||||
end
|
||||
|
||||
def test_invalid_revision_diff
|
||||
get :diff, :id => 1, :rev => '1', :rev_to => 'something_weird'
|
||||
assert_response 404
|
||||
assert_error_tag :content => /was not found/
|
||||
end
|
||||
|
||||
def test_empty_revision
|
||||
['', ' ', nil].each do |r|
|
||||
get :revision, :id => 1, :rev => r
|
||||
|
||||
@@ -72,24 +72,40 @@ class ChangesetTest < ActiveSupport::TestCase
|
||||
Setting.commit_ref_keywords = '*'
|
||||
Setting.commit_logtime_enabled = '1'
|
||||
|
||||
c = Changeset.new(:repository => Project.find(1).repository,
|
||||
:committed_on => 24.hours.ago,
|
||||
:comments => 'Worked on this issue #1 @2h',
|
||||
:revision => '520',
|
||||
:user => User.find(2))
|
||||
assert_difference 'TimeEntry.count' do
|
||||
c.scan_comment_for_issue_ids
|
||||
{
|
||||
'2' => 2.0,
|
||||
'2h' => 2.0,
|
||||
'2hours' => 2.0,
|
||||
'15m' => 0.25,
|
||||
'15min' => 0.25,
|
||||
'3h15' => 3.25,
|
||||
'3h15m' => 3.25,
|
||||
'3h15min' => 3.25,
|
||||
'3:15' => 3.25,
|
||||
'3.25' => 3.25,
|
||||
'3.25h' => 3.25,
|
||||
'3,25' => 3.25,
|
||||
'3,25h' => 3.25,
|
||||
}.each do |syntax, expected_hours|
|
||||
c = Changeset.new(:repository => Project.find(1).repository,
|
||||
:committed_on => 24.hours.ago,
|
||||
:comments => "Worked on this issue #1 @#{syntax}",
|
||||
:revision => '520',
|
||||
:user => User.find(2))
|
||||
assert_difference 'TimeEntry.count' do
|
||||
c.scan_comment_for_issue_ids
|
||||
end
|
||||
assert_equal [1], c.issue_ids.sort
|
||||
|
||||
time = TimeEntry.first(:order => 'id desc')
|
||||
assert_equal 1, time.issue_id
|
||||
assert_equal 1, time.project_id
|
||||
assert_equal 2, time.user_id
|
||||
assert_equal expected_hours, time.hours, "@#{syntax} should be logged as #{expected_hours} hours but was #{time.hours}"
|
||||
assert_equal Date.yesterday, time.spent_on
|
||||
assert time.activity.is_default?
|
||||
assert time.comments.include?('r520'), "r520 was expected in time_entry comments: #{time.comments}"
|
||||
end
|
||||
assert_equal [1], c.issue_ids.sort
|
||||
|
||||
time = TimeEntry.first(:order => 'id desc')
|
||||
assert_equal 1, time.issue_id
|
||||
assert_equal 1, time.project_id
|
||||
assert_equal 2, time.user_id
|
||||
assert_equal 2.0, time.hours
|
||||
assert_equal Date.yesterday, time.spent_on
|
||||
assert time.activity.is_default?
|
||||
assert time.comments.include?('r520'), "r520 was expected in time_entry comments: #{time.comments}"
|
||||
end
|
||||
|
||||
def test_ref_keywords_closing_with_timelog
|
||||
@@ -100,7 +116,7 @@ class ChangesetTest < ActiveSupport::TestCase
|
||||
|
||||
c = Changeset.new(:repository => Project.find(1).repository,
|
||||
:committed_on => Time.now,
|
||||
:comments => 'This is a comment. Fixes #1 @2.5, #2 @1',
|
||||
:comments => 'This is a comment. Fixes #1 @4.5, #2 @1',
|
||||
:user => User.find(2))
|
||||
assert_difference 'TimeEntry.count', 2 do
|
||||
c.scan_comment_for_issue_ids
|
||||
|
||||
@@ -484,7 +484,6 @@ class QueryTest < ActiveSupport::TestCase
|
||||
# Users not in a group
|
||||
assert_query_statement_includes @query, "#{Issue.table_name}.assigned_to_id IS NULL OR #{Issue.table_name}.assigned_to_id NOT IN ('#{@user_in_group.id}','#{@second_user_in_group.id}','#{@user_in_group2.id}')"
|
||||
assert_find_issues_with_query_is_successful @query
|
||||
|
||||
end
|
||||
|
||||
should "search assigned to any group member (all)" do
|
||||
@@ -494,7 +493,22 @@ class QueryTest < ActiveSupport::TestCase
|
||||
# Only users in a group
|
||||
assert_query_statement_includes @query, "#{Issue.table_name}.assigned_to_id IN ('#{@user_in_group.id}','#{@second_user_in_group.id}','#{@user_in_group2.id}')"
|
||||
assert_find_issues_with_query_is_successful @query
|
||||
|
||||
end
|
||||
|
||||
should "return an empty set with = empty group" do
|
||||
@empty_group = Group.generate!
|
||||
@query = Query.new(:name => '_')
|
||||
@query.add_filter('member_of_group', '=', [@empty_group.id.to_s])
|
||||
|
||||
assert_equal [], find_issues_with_query(@query)
|
||||
end
|
||||
|
||||
should "return issues with ! empty group" do
|
||||
@empty_group = Group.generate!
|
||||
@query = Query.new(:name => '_')
|
||||
@query.add_filter('member_of_group', '!', [@empty_group.id.to_s])
|
||||
|
||||
assert_find_issues_with_query_is_successful @query
|
||||
end
|
||||
end
|
||||
|
||||
@@ -540,6 +554,22 @@ class QueryTest < ActiveSupport::TestCase
|
||||
assert_query_statement_includes @query, "#{Issue.table_name}.assigned_to_id IN ('#{@manager.id}','#{@developer.id}','#{@boss.id}')"
|
||||
assert_find_issues_with_query_is_successful @query
|
||||
end
|
||||
|
||||
should "return an empty set with empty role" do
|
||||
@empty_role = Role.generate!
|
||||
@query = Query.new(:name => '_')
|
||||
@query.add_filter('assigned_to_role', '=', [@empty_role.id.to_s])
|
||||
|
||||
assert_equal [], find_issues_with_query(@query)
|
||||
end
|
||||
|
||||
should "return issues with ! empty role" do
|
||||
@empty_role = Role.generate!
|
||||
@query = Query.new(:name => '_')
|
||||
@query.add_filter('member_of_group', '!', [@empty_role.id.to_s])
|
||||
|
||||
assert_find_issues_with_query_is_successful @query
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -60,15 +60,15 @@ class WatcherTest < ActiveSupport::TestCase
|
||||
assert @issue.watcher_recipients.empty?
|
||||
assert @issue.add_watcher(@user)
|
||||
|
||||
@user.mail_notification = true
|
||||
@user.save
|
||||
@user.mail_notification = 'all'
|
||||
@user.save!
|
||||
@issue.reload
|
||||
assert @issue.watcher_recipients.include?(@user.mail)
|
||||
|
||||
@user.mail_notification = false
|
||||
@user.save
|
||||
@user.mail_notification = 'none'
|
||||
@user.save!
|
||||
@issue.reload
|
||||
assert @issue.watcher_recipients.include?(@user.mail)
|
||||
assert !@issue.watcher_recipients.include?(@user.mail)
|
||||
end
|
||||
|
||||
def test_unwatch
|
||||
|
||||
@@ -58,7 +58,8 @@ module Redmine
|
||||
# Returns an array of watchers' email addresses
|
||||
def watcher_recipients
|
||||
notified = watcher_users.active
|
||||
|
||||
notified.reject! {|user| user.mail_notification == 'none'}
|
||||
|
||||
if respond_to?(:visible?)
|
||||
notified.reject! {|user| !visible?(user)}
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user