openall_time_applet 0.0.38 → 0.0.40
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Gemfile +2 -0
- data/Gemfile.lock +25 -17
- data/VERSION +1 -1
- data/conf/db_schema.rb +3 -1
- data/glade/win_main.glade +15 -6
- data/gui/trayicon.rb +3 -5
- data/gui/win_main.rb +403 -189
- data/gui/win_preferences.rb +9 -1
- data/lib/openall_time_applet.rb +79 -20
- data/locales/da_DK/LC_MESSAGES/default.mo +0 -0
- data/locales/da_DK/LC_MESSAGES/default.po +89 -73
- data/models/task.rb +62 -3
- data/models/timelog.rb +30 -0
- data/openall_time_applet.gemspec +14 -8
- metadata +35 -15
data/models/task.rb
CHANGED
@@ -7,20 +7,31 @@ class Openall_time_applet::Models::Task < Knj::Datarow
|
|
7
7
|
[:Timelog, :task_id, :timelogs]
|
8
8
|
]
|
9
9
|
|
10
|
+
def initialize(*args, &block)
|
11
|
+
super(*args, &block)
|
12
|
+
|
13
|
+
#Fix default values.
|
14
|
+
self[:active] = 1 if self[:active].to_s == ""
|
15
|
+
end
|
16
|
+
|
10
17
|
def self.update_cache(d, args)
|
11
18
|
res = nil
|
12
19
|
args[:oata].oa_conn do |conn|
|
13
20
|
res = conn.request(:getAllTasksForUser)
|
14
21
|
end
|
15
22
|
|
23
|
+
#Update all tasks for current user.
|
24
|
+
found_ids = []
|
16
25
|
res.each do |task_data|
|
17
|
-
task = self.ob.get_by(:Task,
|
26
|
+
task = self.ob.get_by(:Task, "openall_uid" => task_data["uid"])
|
18
27
|
data_hash = {
|
19
28
|
:openall_uid => task_data["uid"],
|
20
|
-
:title => task_data["title"]
|
29
|
+
:title => task_data["title"],
|
30
|
+
:status => task_data["status"],
|
31
|
+
:active => 1
|
21
32
|
}
|
22
33
|
|
23
|
-
org = self.ob.get_by(:Organisation,
|
34
|
+
org = self.ob.get_by(:Organisation, "openall_uid" => task_data["organisation_uid"])
|
24
35
|
data_hash[:organisation_id] = org.id if org
|
25
36
|
|
26
37
|
if task
|
@@ -28,6 +39,54 @@ class Openall_time_applet::Models::Task < Knj::Datarow
|
|
28
39
|
else
|
29
40
|
task = self.ob.add(:Task, data_hash)
|
30
41
|
end
|
42
|
+
|
43
|
+
found_ids << task.id
|
44
|
+
end
|
45
|
+
|
46
|
+
#Mark all tasks not given as not-active.
|
47
|
+
d.ob.list(:Task, "id_not" => found_ids) do |task|
|
48
|
+
task[:active] = 0
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
#Returns all open tasks or tasks that are attached to timelogs.
|
53
|
+
def self.tasks_to_show(d)
|
54
|
+
tasks = {}
|
55
|
+
|
56
|
+
#Get lists of tasks that are not closed.
|
57
|
+
self.ob.list(:Task, "status_not" => "Closed", "active" => 1) do |task|
|
58
|
+
tasks[task.id] = task
|
59
|
+
end
|
60
|
+
|
61
|
+
#Get missing tasks that have attached timelogs.
|
62
|
+
self.ob.list(:Task, [:Timelog, "task_id_not"] => tasks.keys) do |task|
|
63
|
+
tasks[task.id] = task
|
64
|
+
end
|
65
|
+
|
66
|
+
#Sort the found tasks
|
67
|
+
Knj::ArrayExt.hash_sort(tasks) do |task1, task2|
|
68
|
+
task1[1][:title].to_s.downcase <=> task2[1][:title].to_s.downcase
|
69
|
+
end
|
70
|
+
|
71
|
+
#Return the found tasks.
|
72
|
+
if block_given?
|
73
|
+
tasks.each do |task_id, task|
|
74
|
+
yield(task)
|
75
|
+
end
|
76
|
+
else
|
77
|
+
return tasks.values
|
31
78
|
end
|
32
79
|
end
|
80
|
+
|
81
|
+
#Returns the name of the task (and the organisation).
|
82
|
+
def name
|
83
|
+
str = self[:title].to_s.strip
|
84
|
+
str = "[#{_("no name")}]" if str.empty?
|
85
|
+
|
86
|
+
if org = self.organisation
|
87
|
+
str << " (#{Knj::Strings.shorten(org.name, 15)})"
|
88
|
+
end
|
89
|
+
|
90
|
+
return str
|
91
|
+
end
|
33
92
|
end
|
data/models/timelog.rb
CHANGED
@@ -15,14 +15,18 @@ class Openall_time_applet::Models::Timelog < Knj::Datarow
|
|
15
15
|
#Fix default time-type (SQLite3 doesnt support this).
|
16
16
|
self[:timetype] = "normal" if self[:timetype].to_s == ""
|
17
17
|
self[:timestamp] = Datet.new.dbstr if self[:timestamp].to_s == ""
|
18
|
+
self[:timetype] = "normal" if self[:timetype].to_s == ""
|
18
19
|
end
|
19
20
|
|
20
21
|
#Treat data before inserting into database.
|
21
22
|
def self.add(d)
|
23
|
+
d.data[:timestamp] = Datet.new if !d.data.key?(:timestmap) or !d.data[:timestamp]
|
22
24
|
d.data[:time] = 0 if d.data[:time].to_s.strip.length <= 0
|
23
25
|
d.data[:time_transport] = 0 if d.data[:time_transport].to_s.strip.length <= 0
|
24
26
|
d.data[:parent_timelog_id] = 0 if !d.data.key?(:parent_timelog_id)
|
25
27
|
d.data[:sync_need] = 1 if !d.data.key?(:sync_need)
|
28
|
+
d.data[:task_id] = 0 if !d.data.key?(:task_id)
|
29
|
+
d.data[:timetype] = "normal" if !d.data.key?(:timetype)
|
26
30
|
end
|
27
31
|
|
28
32
|
#Pushes timelogs and time to OpenAll.
|
@@ -30,6 +34,10 @@ class Openall_time_applet::Models::Timelog < Knj::Datarow
|
|
30
34
|
args[:oata].oa_conn do |conn|
|
31
35
|
#Go through timelogs that needs syncing and has a task set.
|
32
36
|
self.ob.list(:Timelog, "sync_need" => 1, "task_id_not" => ["", 0]) do |timelog|
|
37
|
+
task = timelog.task
|
38
|
+
raise sprintf(_("No task has been set on timelog: '%s'."), timelog.descr_short) if !task
|
39
|
+
raise sprintf(_("Task is closed and the timelog cannot be synced: '%s'."), timelog.descr_short) if task[:status] == "Closed"
|
40
|
+
|
33
41
|
secs_sum = timelog[:time_sync].to_i + timelog[:time_transport].to_i
|
34
42
|
next if secs_sum <= 0 or !timelog.task
|
35
43
|
|
@@ -74,6 +82,19 @@ class Openall_time_applet::Models::Timelog < Knj::Datarow
|
|
74
82
|
end
|
75
83
|
end
|
76
84
|
|
85
|
+
def update(data)
|
86
|
+
data.each do |key, val|
|
87
|
+
case key.to_sym
|
88
|
+
when :timetype
|
89
|
+
if !self.class.time_types.key?(val.to_s)
|
90
|
+
raise sprintf(_("No such time-type: '%s'."), val)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
super(data)
|
96
|
+
end
|
97
|
+
|
77
98
|
#Returns a short one-line short description.
|
78
99
|
def descr_short
|
79
100
|
descr = self[:descr].to_s.gsub("\n", " ").gsub(/\s{2,}/, " ")
|
@@ -121,4 +142,13 @@ class Openall_time_applet::Models::Timelog < Knj::Datarow
|
|
121
142
|
end
|
122
143
|
end
|
123
144
|
end
|
145
|
+
|
146
|
+
#The possible options for time-types that should be shown in various combo-boxes and such.
|
147
|
+
def self.time_types
|
148
|
+
return {
|
149
|
+
"normal" => _("Normal"),
|
150
|
+
"overtime150" => sprintf(_("Overtime %s"), 150),
|
151
|
+
"overtime200" => sprintf(_("Overtime %s"), 200)
|
152
|
+
}
|
153
|
+
end
|
124
154
|
end
|
data/openall_time_applet.gemspec
CHANGED
@@ -4,14 +4,14 @@
|
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
|
-
s.name =
|
8
|
-
s.version = "0.0.
|
7
|
+
s.name = "openall_time_applet"
|
8
|
+
s.version = "0.0.40"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Kasper Johansen"]
|
12
|
-
s.date =
|
13
|
-
s.description =
|
14
|
-
s.email =
|
12
|
+
s.date = "2012-09-08"
|
13
|
+
s.description = "Off-line time-tracking for OpenAll with syncing when online."
|
14
|
+
s.email = "k@spernj.org"
|
15
15
|
s.executables = ["OpenAll Timelogging", "openall_time_applet.rb"]
|
16
16
|
s.extra_rdoc_files = [
|
17
17
|
"LICENSE.txt",
|
@@ -58,11 +58,11 @@ Gem::Specification.new do |s|
|
|
58
58
|
"spec/sync_spec.rb",
|
59
59
|
"spec/tray_timelogs_spec.rb"
|
60
60
|
]
|
61
|
-
s.homepage =
|
61
|
+
s.homepage = "http://github.com/kaspernj/openall_time_applet"
|
62
62
|
s.licenses = ["MIT"]
|
63
63
|
s.require_paths = ["lib"]
|
64
|
-
s.rubygems_version =
|
65
|
-
s.summary =
|
64
|
+
s.rubygems_version = "1.8.24"
|
65
|
+
s.summary = "Time-tracking for OpenAll."
|
66
66
|
|
67
67
|
if s.respond_to? :specification_version then
|
68
68
|
s.specification_version = 3
|
@@ -76,7 +76,9 @@ Gem::Specification.new do |s|
|
|
76
76
|
s.add_runtime_dependency(%q<rmagick>, [">= 0"])
|
77
77
|
s.add_runtime_dependency(%q<datet>, [">= 0"])
|
78
78
|
s.add_runtime_dependency(%q<http2>, [">= 0"])
|
79
|
+
s.add_runtime_dependency(%q<gtk2_expander_settings>, [">= 0"])
|
79
80
|
s.add_runtime_dependency(%q<gtk2_treeview_settings>, [">= 0"])
|
81
|
+
s.add_runtime_dependency(%q<gtk2_window_settings>, [">= 0"])
|
80
82
|
s.add_development_dependency(%q<rspec>, ["~> 2.8.0"])
|
81
83
|
s.add_development_dependency(%q<rdoc>, ["~> 3.12"])
|
82
84
|
s.add_development_dependency(%q<bundler>, [">= 1.0.0"])
|
@@ -90,7 +92,9 @@ Gem::Specification.new do |s|
|
|
90
92
|
s.add_dependency(%q<rmagick>, [">= 0"])
|
91
93
|
s.add_dependency(%q<datet>, [">= 0"])
|
92
94
|
s.add_dependency(%q<http2>, [">= 0"])
|
95
|
+
s.add_dependency(%q<gtk2_expander_settings>, [">= 0"])
|
93
96
|
s.add_dependency(%q<gtk2_treeview_settings>, [">= 0"])
|
97
|
+
s.add_dependency(%q<gtk2_window_settings>, [">= 0"])
|
94
98
|
s.add_dependency(%q<rspec>, ["~> 2.8.0"])
|
95
99
|
s.add_dependency(%q<rdoc>, ["~> 3.12"])
|
96
100
|
s.add_dependency(%q<bundler>, [">= 1.0.0"])
|
@@ -105,7 +109,9 @@ Gem::Specification.new do |s|
|
|
105
109
|
s.add_dependency(%q<rmagick>, [">= 0"])
|
106
110
|
s.add_dependency(%q<datet>, [">= 0"])
|
107
111
|
s.add_dependency(%q<http2>, [">= 0"])
|
112
|
+
s.add_dependency(%q<gtk2_expander_settings>, [">= 0"])
|
108
113
|
s.add_dependency(%q<gtk2_treeview_settings>, [">= 0"])
|
114
|
+
s.add_dependency(%q<gtk2_window_settings>, [">= 0"])
|
109
115
|
s.add_dependency(%q<rspec>, ["~> 2.8.0"])
|
110
116
|
s.add_dependency(%q<rdoc>, ["~> 3.12"])
|
111
117
|
s.add_dependency(%q<bundler>, [">= 1.0.0"])
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: openall_time_applet
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.0.
|
5
|
+
version: 0.0.40
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Kasper Johansen
|
@@ -10,8 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2012-08
|
14
|
-
default_executable:
|
13
|
+
date: 2012-09-08 00:00:00 Z
|
15
14
|
dependencies:
|
16
15
|
- !ruby/object:Gem::Dependency
|
17
16
|
name: knjrbfw
|
@@ -102,7 +101,7 @@ dependencies:
|
|
102
101
|
prerelease: false
|
103
102
|
version_requirements: *id008
|
104
103
|
- !ruby/object:Gem::Dependency
|
105
|
-
name:
|
104
|
+
name: gtk2_expander_settings
|
106
105
|
requirement: &id009 !ruby/object:Gem::Requirement
|
107
106
|
none: false
|
108
107
|
requirements:
|
@@ -113,8 +112,30 @@ dependencies:
|
|
113
112
|
prerelease: false
|
114
113
|
version_requirements: *id009
|
115
114
|
- !ruby/object:Gem::Dependency
|
116
|
-
name:
|
115
|
+
name: gtk2_treeview_settings
|
117
116
|
requirement: &id010 !ruby/object:Gem::Requirement
|
117
|
+
none: false
|
118
|
+
requirements:
|
119
|
+
- - ">="
|
120
|
+
- !ruby/object:Gem::Version
|
121
|
+
version: "0"
|
122
|
+
type: :runtime
|
123
|
+
prerelease: false
|
124
|
+
version_requirements: *id010
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: gtk2_window_settings
|
127
|
+
requirement: &id011 !ruby/object:Gem::Requirement
|
128
|
+
none: false
|
129
|
+
requirements:
|
130
|
+
- - ">="
|
131
|
+
- !ruby/object:Gem::Version
|
132
|
+
version: "0"
|
133
|
+
type: :runtime
|
134
|
+
prerelease: false
|
135
|
+
version_requirements: *id011
|
136
|
+
- !ruby/object:Gem::Dependency
|
137
|
+
name: rspec
|
138
|
+
requirement: &id012 !ruby/object:Gem::Requirement
|
118
139
|
none: false
|
119
140
|
requirements:
|
120
141
|
- - ~>
|
@@ -122,10 +143,10 @@ dependencies:
|
|
122
143
|
version: 2.8.0
|
123
144
|
type: :development
|
124
145
|
prerelease: false
|
125
|
-
version_requirements: *
|
146
|
+
version_requirements: *id012
|
126
147
|
- !ruby/object:Gem::Dependency
|
127
148
|
name: rdoc
|
128
|
-
requirement: &
|
149
|
+
requirement: &id013 !ruby/object:Gem::Requirement
|
129
150
|
none: false
|
130
151
|
requirements:
|
131
152
|
- - ~>
|
@@ -133,10 +154,10 @@ dependencies:
|
|
133
154
|
version: "3.12"
|
134
155
|
type: :development
|
135
156
|
prerelease: false
|
136
|
-
version_requirements: *
|
157
|
+
version_requirements: *id013
|
137
158
|
- !ruby/object:Gem::Dependency
|
138
159
|
name: bundler
|
139
|
-
requirement: &
|
160
|
+
requirement: &id014 !ruby/object:Gem::Requirement
|
140
161
|
none: false
|
141
162
|
requirements:
|
142
163
|
- - ">="
|
@@ -144,10 +165,10 @@ dependencies:
|
|
144
165
|
version: 1.0.0
|
145
166
|
type: :development
|
146
167
|
prerelease: false
|
147
|
-
version_requirements: *
|
168
|
+
version_requirements: *id014
|
148
169
|
- !ruby/object:Gem::Dependency
|
149
170
|
name: jeweler
|
150
|
-
requirement: &
|
171
|
+
requirement: &id015 !ruby/object:Gem::Requirement
|
151
172
|
none: false
|
152
173
|
requirements:
|
153
174
|
- - ~>
|
@@ -155,7 +176,7 @@ dependencies:
|
|
155
176
|
version: 1.8.3
|
156
177
|
type: :development
|
157
178
|
prerelease: false
|
158
|
-
version_requirements: *
|
179
|
+
version_requirements: *id015
|
159
180
|
description: Off-line time-tracking for OpenAll with syncing when online.
|
160
181
|
email: k@spernj.org
|
161
182
|
executables:
|
@@ -206,7 +227,6 @@ files:
|
|
206
227
|
- spec/spec_helper.rb
|
207
228
|
- spec/sync_spec.rb
|
208
229
|
- spec/tray_timelogs_spec.rb
|
209
|
-
has_rdoc: true
|
210
230
|
homepage: http://github.com/kaspernj/openall_time_applet
|
211
231
|
licenses:
|
212
232
|
- MIT
|
@@ -220,7 +240,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
220
240
|
requirements:
|
221
241
|
- - ">="
|
222
242
|
- !ruby/object:Gem::Version
|
223
|
-
hash:
|
243
|
+
hash: -2908154702793645026
|
224
244
|
segments:
|
225
245
|
- 0
|
226
246
|
version: "0"
|
@@ -233,7 +253,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
233
253
|
requirements: []
|
234
254
|
|
235
255
|
rubyforge_project:
|
236
|
-
rubygems_version: 1.
|
256
|
+
rubygems_version: 1.8.24
|
237
257
|
signing_key:
|
238
258
|
specification_version: 3
|
239
259
|
summary: Time-tracking for OpenAll.
|