ig3tool 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. data/bin/ig3tool +17 -21
  2. data/lib/actions/bib.rb +295 -0
  3. data/lib/actions/bitching.rb +19 -0
  4. data/lib/actions/cultuur.rb +3 -0
  5. data/lib/actions/interne.rb +98 -0
  6. data/lib/actions/kaching.rb +90 -0
  7. data/lib/actions/people.rb +178 -0
  8. data/lib/actions/printing.rb +125 -0
  9. data/lib/actions/product.rb +154 -0
  10. data/lib/bib.rb +94 -0
  11. data/lib/billing.rb +112 -0
  12. data/lib/bitching.rb +49 -0
  13. data/lib/config.rb +19 -0
  14. data/lib/glade/cola_light_small.png +0 -0
  15. data/lib/glade/cola_light_xsmall.png +0 -0
  16. data/lib/glade/cola_small.png +0 -0
  17. data/lib/glade/cola_xsmall.png +0 -0
  18. data/lib/glade/doos_small.png +0 -0
  19. data/lib/glade/doos_xsmall.png +0 -0
  20. data/lib/glade/icons/cola_light_small.png +0 -0
  21. data/lib/glade/icons/cola_light_xsmall.png +0 -0
  22. data/lib/glade/icons/cola_small.png +0 -0
  23. data/lib/glade/icons/cola_xsmall.png +0 -0
  24. data/lib/glade/icons/doos_small.png +0 -0
  25. data/lib/glade/icons/doos_xsmall.png +0 -0
  26. data/lib/glade/icons/piggy_small.png +0 -0
  27. data/lib/glade/icons/piggy_xsmall.png +0 -0
  28. data/lib/glade/money_small.png +0 -0
  29. data/lib/glade/money_xsmall.png +0 -0
  30. data/lib/glade/newinterne.glade +504 -0
  31. data/lib/glade/piggy_small.png +0 -0
  32. data/lib/glade/piggy_xsmall.png +0 -0
  33. data/lib/glade/sales.glade +89 -87
  34. data/lib/horrible_hack.rb +15 -0
  35. data/lib/interne.rb +111 -0
  36. data/lib/ldap.rb +104 -0
  37. data/lib/log.rb +25 -0
  38. data/lib/membership.rb +32 -0
  39. data/lib/mymd5.rb +95 -0
  40. data/lib/people.rb +143 -0
  41. data/lib/printing.rb +238 -0
  42. data/lib/request.rb +14 -0
  43. data/lib/sales.rb +158 -0
  44. data/lib/ui/automaatwindow.rb +2 -2
  45. data/lib/ui/bibliotheekwindow.rb +16 -17
  46. data/lib/ui/bibwindow.rb +15 -15
  47. data/lib/ui/gladehelper.rb +20 -6
  48. data/lib/ui/internewindow.rb +12 -9
  49. data/lib/ui/loginwindow.rb +2 -4
  50. data/lib/ui/memberswindow.rb +9 -9
  51. data/lib/ui/newinterne.rb +258 -0
  52. data/lib/ui/peoplewindow.rb +14 -16
  53. data/lib/ui/printenwindow.rb +11 -11
  54. data/lib/ui/printingwindow.rb +19 -20
  55. data/lib/ui/productswindow.rb +27 -15
  56. data/lib/ui/saleswindow.rb +21 -8
  57. data/lib/ui/toolwindow.rb +5 -3
  58. data/lib/utils.rb +106 -0
  59. data/lib/web.rb +98 -0
  60. metadata +48 -3
@@ -104,7 +104,7 @@ module Ig3tool
104
104
  return if username.nil? or username.empty?
105
105
 
106
106
  begin
107
- user = $global['client'].print_userinfo([ username ])
107
+ user = $client.print_userinfo([ username ])
108
108
 
109
109
  @glade.get_widget('user').text = username # Kan username of alias zijn waarop men zoekt
110
110
  if user.nil?
@@ -152,7 +152,7 @@ module Ig3tool
152
152
  when :adduser
153
153
  @undo.method = :none
154
154
  begin
155
- answer = $global['client'].print_delaccount!({ :username => @undo.username })
155
+ answer = $client.print_delaccount!({ :username => @undo.username })
156
156
  @undo.method = :deluser
157
157
  rescue Exception => e
158
158
  _print_msg "Fout: Undo: #{$!}"
@@ -162,7 +162,7 @@ module Ig3tool
162
162
  when :deluser
163
163
  @undo.method = :none
164
164
  begin
165
- answer = $global['client'].print_addaccount!({ :username => @undo.username, :email => @undo.email, :amount => @undo.amount })
165
+ answer = $client.print_addaccount!({ :username => @undo.username, :email => @undo.email, :amount => @undo.amount })
166
166
  @undo.method = :adduser
167
167
  rescue Exception => e
168
168
  _print_msg "Fout: Undo: #{$!}"
@@ -172,7 +172,7 @@ module Ig3tool
172
172
  when :addcredit
173
173
  @undo.method = :none
174
174
  begin
175
- answer = $global['client'].print_addcredit!({ :username => @undo.username, :email => @undo.email, :amount => - @undo.amount })
175
+ answer = $client.print_addcredit!({ :username => @undo.username, :email => @undo.email, :amount => - @undo.amount })
176
176
  @undo.method = :addcredit
177
177
  @undo.amount = - @undo.amount
178
178
  rescue Exception => e
@@ -212,10 +212,10 @@ module Ig3tool
212
212
  begin
213
213
  # Indien de gebruiker nog niet bestaat, creeer automatisch een account wanneer er
214
214
  # op 'toevoegen krediet' wordt geklikt
215
- if !$global['client'].print_userinfo([ username ])
216
- $global['client'].print_addaccount!({ :username => username, :email => email })
215
+ if !$client.print_userinfo([ username ])
216
+ $client.print_addaccount!({ :username => username, :email => email })
217
217
  end
218
- answer = $global['client'].print_addcredit!({ :username => username, :amount => amount })
218
+ answer = $client.print_addcredit!({ :username => username, :amount => amount })
219
219
  _print_msg "#{@user_entry.text} Gets #{amount} Credits"
220
220
  rescue Exception => e
221
221
  _print_msg "Fout: Toepassen: #{$!}"
@@ -266,7 +266,7 @@ module Ig3tool
266
266
 
267
267
  def _unrefund(selected)
268
268
  begin
269
- answer = $global['client'].print_unrefund!({ :jobid => selected.jobid }) # TODO-CHECK
269
+ answer = $client.print_unrefund!({ :jobid => selected.jobid }) # TODO-CHECK
270
270
  @log_list.model.row_changed selection.path, selection # Zorgt voor row update appearance
271
271
  @refund.label = "Terugbetalen"
272
272
  rescue Exception => e
@@ -287,7 +287,7 @@ module Ig3tool
287
287
 
288
288
  def _refund(selected)
289
289
  begin
290
- answer = $global['client'].print_refund!({ :jobid => selected.jobid })
290
+ answer = $client.print_refund!({ :jobid => selected.jobid })
291
291
  @log_list.model.row_changed selection.path, selection
292
292
  @refund.label = "Toch betalen"
293
293
  rescue Exception => e
@@ -299,7 +299,7 @@ module Ig3tool
299
299
  @credits_list.model.model.clear
300
300
  begin
301
301
  # Haal alle printusers hun print-info op
302
- answer = $global['client'].print_credits
302
+ answer = $client.print_credits
303
303
  answer.each { |l| @credits_list.model.model.append[0] = l }
304
304
  rescue Exception => e
305
305
  _print_msg "Fout: Credits: #{$!}"
@@ -310,7 +310,7 @@ module Ig3tool
310
310
  @log_list.model.clear
311
311
  begin
312
312
  # Haal de laatste 50 Printjobs op
313
- answer = $global['client'].print_log( [ 50 ] )
313
+ answer = $client.print_log( [ 50 ] )
314
314
  answer.each { |l| @log_list.model.append[0] = l }
315
315
  rescue Exception => e
316
316
  _print_msg "Fout: Log: #{$!}"
@@ -12,8 +12,7 @@ module Ig3tool
12
12
  def initialize
13
13
  super("printing.glade")
14
14
 
15
- #@c = Client.new("infogroep.be")
16
- @c = $global["client"]
15
+ #$client = Client.new("infogroep.be")
17
16
 
18
17
  #bindtextdomain(domain, localedir, nil, "UTF-8")
19
18
  #@glade = GladeXML.new(path_or_data, root, domain, localedir, flag) {|handler| method(handler)}
@@ -93,7 +92,7 @@ module Ig3tool
93
92
  _show(logentry.username)
94
93
  else
95
94
  begin
96
- @c.print_refund!({"logid" => logentry["id"]})
95
+ $client.print_refund!({"logid" => logentry["id"]})
97
96
  @notification.text = "refunded print of #{logentry["amount"]} to #{logentry["username"]}"
98
97
  _update_log
99
98
  rescue Exception => e
@@ -109,7 +108,7 @@ module Ig3tool
109
108
  _show(logentry.username)
110
109
  else
111
110
  begin
112
- @c.print_refund!({"logid" => logentry["id"]})
111
+ $client.print_refund!({"logid" => logentry["id"]})
113
112
  @notification.text = "refunded print of #{logentry["amount"]} to #{logentry["username"]}"
114
113
  rescue Exception => e
115
114
  #puts "ERR: " + e.message.to_s
@@ -173,29 +172,29 @@ module Ig3tool
173
172
  clear_all(nil, false)
174
173
  else
175
174
  begin
176
- user = @c.print_user(@username.text)
177
- person = @c.person_lookup({"username" => @username.text})
175
+ user = $client.print_user(@username.text)
176
+ person = $client.person_lookup({"username" => @username.text})
178
177
  raise NotFound, "the ig3tool imps found no such user..." if person.nil?
179
178
  person = person[0]
180
179
  @email.text = person["email"]
181
180
  @saldo.text = user["saldo"]
182
181
  @firstname.text = person["first_name"]
183
182
  @lastname.text = person["last_name"]
184
- @status.text = @c.person_status(person["username"])
183
+ @status.text = $client.person_status(person["username"])
185
184
  @notification.text = "the ig3tool imps found #{user["username"]}..."
186
185
  @apply.image = Gtk::Image.new(Gtk::Stock::ADD, Gtk::IconSize::BUTTON)
187
186
  @apply.label = Gtk::Stock::ADD
188
187
  @delta.grab_focus
189
188
  rescue Exception => e
190
189
  begin
191
- person = @c.person_lookup({"username" => @username.text})
190
+ person = $client.person_lookup({"username" => @username.text})
192
191
  raise NotFound, "the ig3tool imps found no such user..." if person.nil? or person.empty?
193
192
  person = person[0]
194
193
  @email.text = person["email"]
195
194
  @saldo.text = "0"
196
195
  @firstname.text = person["first_name"]
197
196
  @lastname.text = person["last_name"]
198
- @status.text = @c.person_status(person["username"])
197
+ @status.text = $client.person_status(person["username"])
199
198
  @notification.text = "the ig3tool imps found #{person["username"]}..."
200
199
  @apply.image = Gtk::Image.new(Gtk::Stock::ADD, Gtk::IconSize::BUTTON)
201
200
  @apply.label = Gtk::Stock::ADD
@@ -247,7 +246,7 @@ module Ig3tool
247
246
 
248
247
  def smart_add(widget)
249
248
  begin
250
- @c.print_addcredit!({:username => @username.text, :amount => @delta.text})
249
+ $client.print_addcredit!({:username => @username.text, :amount => @delta.text})
251
250
  @notification.text = "the imps added #{@delta.text} euro's to #{@username.text}'s account..."
252
251
  rescue Exception => e
253
252
  @notification.text = (e.class.to_s + " - " + e.message).smaller
@@ -268,7 +267,7 @@ module Ig3tool
268
267
  if amount.to_f < 0
269
268
  quick_message("\n the ig3tool imps do not accept negative values... \n")
270
269
  else
271
- @c.print_update!({:username => @username.text,
270
+ $client.print_update!({:username => @username.text,
272
271
  :first_name => @firstname.text,
273
272
  :last_name => @lastname.text,
274
273
  :email => @email.text,
@@ -295,14 +294,14 @@ module Ig3tool
295
294
  def _show(username)
296
295
  #puts "show: #{username}"
297
296
  begin
298
- user = @c.print_user(username)
299
- person = @c.person_lookup({"username", username})[0]
297
+ user = $client.print_user(username)
298
+ person = $client.person_lookup({"username", username})[0]
300
299
  @username.text = username
301
300
  @email.text = person["email"]
302
301
  @saldo.text = user["saldo"].from_c.to_s
303
302
  @firstname.text = person["first_name"]
304
303
  @lastname.text = person["last_name"]
305
- @status.text = @c.person_status(username)
304
+ @status.text = $client.person_status(username)
306
305
  @notification.text = "the ig3tool imps found #{username}..."
307
306
  @apply.image = Gtk::Image.new(Gtk::Stock::ADD, Gtk::IconSize::BUTTON)
308
307
  @apply.label = Gtk::Stock::ADD
@@ -310,7 +309,7 @@ module Ig3tool
310
309
  rescue Exception => e
311
310
  #puts "EXC: " + e.message
312
311
  begin
313
- person = @c.person_lookup({"username", @username.text})
312
+ person = $client.person_lookup({"username", @username.text})
314
313
  raise NotFound, "the ig3tool imps found no such user..." if person.nil? or person.empty?
315
314
  person = person[0]
316
315
  @username.text = username
@@ -318,7 +317,7 @@ module Ig3tool
318
317
  @saldo.text = "0"
319
318
  @firstname.text = person["first_name"]
320
319
  @lastname.text = person["last_name"]
321
- @status.text = @c.person_status(username)
320
+ @status.text = $client.person_status(username)
322
321
  @notification.text = "the ig3tool imps found #{username}..."
323
322
  @apply.image = Gtk::Image.new(Gtk::Stock::ADD, Gtk::IconSize::BUTTON)
324
323
  @apply.label = Gtk::Stock::ADD
@@ -339,9 +338,9 @@ module Ig3tool
339
338
  @usernames_store.clear if clear
340
339
  Thread.new do
341
340
  if @statussearch.active > 0
342
- users = @c.person_everybody.sort{|x,y| x["username"] <=> y["username"]}
341
+ users = $client.person_everybody.sort{|x,y| x["username"] <=> y["username"]}
343
342
  else
344
- users = @c.print_users
343
+ users = $client.print_users
345
344
  end
346
345
  users.each do |user|
347
346
  row = @usernames_store.append
@@ -355,7 +354,7 @@ module Ig3tool
355
354
  def _update_log(clear=true)
356
355
  @filteredlog_store.clear if clear
357
356
  Thread.new do
358
- loglines = @c.print_logs
357
+ loglines = $client.print_logs
359
358
  loglines.each do |ll|
360
359
  @filteredlog_store.append[0] = ll
361
360
  end
@@ -365,7 +364,7 @@ module Ig3tool
365
364
  def _update_biglog(clear=true)
366
365
  @log_store.clear if clear
367
366
  Thread.new do
368
- loglines = @c.print_logs
367
+ loglines = $client.print_logs
369
368
  loglines.each do |ll|
370
369
  @log_store.append[0] = ll
371
370
  end
@@ -2,7 +2,7 @@ module Ig3tool
2
2
 
3
3
  class ProductsWindow < GladeHelper
4
4
  MENU_PATH = ["Producten", "Producten"]
5
- ICON = "emblem-package.png"
5
+ ICON = "doos_xsmall.png"
6
6
 
7
7
  def initialize
8
8
  super("products.glade")
@@ -30,13 +30,15 @@ module Ig3tool
30
30
  s2.add_widget(@glade.get_widget(w))
31
31
  end
32
32
 
33
- @purchase_list = Gtk::ListStore.new(Object, String, String, Integer, String)
33
+ @purchase_list = Gtk::ListStore.new(Object, String, String, String, Integer, Integer)
34
34
  @purchase_view.model = @purchase_list
35
35
  renderer = Gtk::CellRendererText.new
36
36
  renderer.xalign = 1
37
37
  @purchase_view.insert_column(-1, "Datum", renderer, :text => 1)
38
38
  @purchase_view.insert_column(-1, "Totaalprijs", renderer, :text => 2)
39
- @purchase_view.insert_column(-1, "Aantal", renderer, :text => 3)
39
+ @purchase_view.insert_column(-1, "Stukprijs", renderer, :text => 3)
40
+ @purchase_view.insert_column(-1, "Huidig", renderer, :text => 4)
41
+ @purchase_view.insert_column(-1, "Aantal", renderer, :text => 5)
40
42
 
41
43
  renderer = Gtk::CellRendererText.new
42
44
  @products = Gtk::ListStore.new(Object, String)
@@ -45,7 +47,7 @@ module Ig3tool
45
47
 
46
48
  cat_model = Gtk::ListStore.new(String)
47
49
  cat_model.prepend[0] = "Alle categorieën"
48
- $global["client"].product_categories.collect {|x| x.name}.sort.each do |cat|
50
+ $client.product_categories.collect {|x| x.name}.sort.each do |cat|
49
51
  r = cat_model.append
50
52
  r[0] = cat
51
53
  end
@@ -95,18 +97,21 @@ module Ig3tool
95
97
 
96
98
  def add_button_clicked
97
99
  return if @selected_product.nil?
98
- amount = @new_stock.text
99
- price = @new_price.text
100
+ amount = @new_stock.text.to_i
101
+ price = @new_price.text.to_f
100
102
 
101
- args = { :debugger => "dharnie",
102
- :items => { @selected_product.barcode => [amount, price] } }
103
+ args = { :debugger => $client.username,
104
+ :items => { @selected_product.barcode => [amount, amount * price.to_c] }
105
+ }
103
106
 
104
- $global["client"].product_purchase! args
107
+ $client.product_purchase! args
108
+ p = $client.product_purchases(@selected_product.barcode).first
109
+ _add_purchase(p, false)
105
110
  end
106
111
 
107
112
  def category_combo_changed
108
113
  active = @category_combo.active
109
- products = $global["client"].product_all
114
+ products = $client.product_all
110
115
  if active > 0
111
116
  category = @category_combo.active_iter[0]
112
117
  products = products.select {|p| p.category == category}
@@ -145,14 +150,21 @@ module Ig3tool
145
150
  @purchase_list.clear
146
151
  return if @selected_product.nil?
147
152
  @selected_product.purchases.each do |p|
148
- row = @purchase_list.append
149
- row[0] = p
150
- row[1] = p.time.to_s
151
- row[2] = sprintf("%.2f", p.cost.to_s)
152
- row[3] = p.count.to_i
153
+ _add_purchase(p)
153
154
  end
154
155
  end
155
156
 
157
+ def _add_purchase(p, at_end = true)
158
+ row = at_end ? @purchase_list.append : @purchase_list.prepend
159
+ row[0] = p
160
+ row[1] = p.time.to_s
161
+ row[2] = sprintf("%.2f", p.cost.from_c)
162
+ row[3] = sprintf("%.2f", p.cost.from_c/p.count.to_i)
163
+ row[4] = p.current.to_i
164
+ row[5] = p.count.to_i
165
+ end
166
+
167
+
156
168
  end
157
169
 
158
170
  register_window(ProductsWindow)
@@ -17,8 +17,12 @@ module Ig3tool
17
17
  @items.insert_column(-1, "Aantal", r, :text => 0)
18
18
  @items.insert_column(-1, "Product", r, :text => 1)
19
19
  @items.insert_column(-1, "Prijs", r, :text => 2)
20
+ @member_id = @glade.get_widget("member_id")
20
21
 
21
22
  @window.show
23
+ @statushash = {1 => "member", 0 => "non-member", 2 => "debugger"}
24
+ @statushashi = @statushash.invert
25
+
22
26
  end
23
27
 
24
28
  def smartzap_activate
@@ -30,6 +34,7 @@ module Ig3tool
30
34
  when "non member"
31
35
  @target = nil
32
36
  @status = "non member"
37
+ @member_id.active = @statushashi[@status]
33
38
  return
34
39
 
35
40
  when "kaching"
@@ -45,13 +50,14 @@ module Ig3tool
45
50
  # is het een debugger?
46
51
  when /^[a-z]/
47
52
  wanted = {"username", value, "status", "debugger"}
48
- pers = $global["client"].person_lookup(wanted)
53
+ pers = $client.person_lookup(wanted)
49
54
 
50
55
  unless pers.empty?
51
56
  pers = pers.first
52
57
 
53
- @target = pers.username
54
58
  @status = "debugger"
59
+ @member_id.active = @statushashi[@status]
60
+ @target = @debugger = pers.username
55
61
 
56
62
  _get_widget("debugger").model.each do |m, p, i|
57
63
  if i[1] == @target
@@ -65,17 +71,18 @@ module Ig3tool
65
71
 
66
72
  # is het een member?
67
73
  begin
68
- memb = $global["client"].membership_lookup(value)
74
+ memb = $client.membership_lookup(value)
69
75
 
70
76
  @target = memb.barcode
71
77
  @status = "member"
78
+ @member_id.active = @statushashi[@status]
72
79
  return
73
80
  rescue Exception => e
74
81
  end
75
82
 
76
83
  # is het een product?
77
84
  begin
78
- prod = $global["client"].product_lookup(value)
85
+ prod = $client.product_lookup(value)
79
86
  qty = _get_widget("count").text.to_i
80
87
  _add_product(prod, qty)
81
88
  return
@@ -83,6 +90,10 @@ module Ig3tool
83
90
  # het is een vliegtuig!
84
91
  end
85
92
 
93
+ def debugger_changed
94
+ @debugger = _get_widget("debugger").active_iter[1]
95
+ end
96
+
86
97
  def delete_clicked
87
98
  sel = @items.selection.selected
88
99
  @items.model.remove(sel) if sel
@@ -104,6 +115,8 @@ module Ig3tool
104
115
 
105
116
  def clear_clicked
106
117
  @items.model.clear
118
+ @status = "non-member"
119
+ @member_id.active = @statushashi[@status]
107
120
  _update_total
108
121
  end
109
122
 
@@ -127,11 +140,11 @@ module Ig3tool
127
140
  items = _get_items
128
141
 
129
142
  return if items.empty?
130
- params = { "debugger" => @target,
143
+ params = { "debugger" => @debugger,
131
144
  "items" => items }
132
145
 
133
146
  begin
134
- $global["client"].scribble! params
147
+ $client.scribble! params
135
148
  clear_clicked
136
149
  # XXX make sound
137
150
  rescue Exception => e
@@ -142,12 +155,12 @@ module Ig3tool
142
155
  def _kaching
143
156
  items = _get_items
144
157
 
145
- params = { "debugger" => "dharnie", # XXX get username
158
+ params = { "debugger" => @debugger,
146
159
  "items" => items,
147
160
  "status" => @status }
148
161
 
149
162
  begin
150
- $global["client"].kaching! params
163
+ $client.kaching! params
151
164
  clear_clicked
152
165
  # XXX make sound
153
166
  rescue Exception => e
data/lib/ui/toolwindow.rb CHANGED
@@ -29,9 +29,11 @@ module Ig3tool
29
29
  icon = (klass::ICON || "no.xpm")
30
30
  button = create_button(name, icon.to_s)
31
31
  button.signal_connect("clicked") do
32
- @@windows[klass] ||= klass.new
33
- @@windows[klass].show
34
- @@windows[klass].present
32
+ Thread.new do
33
+ @@windows[klass] ||= klass.new
34
+ @@windows[klass].show
35
+ @@windows[klass].present
36
+ end
35
37
  end
36
38
  bigbox.add(button)
37
39
  end
data/lib/utils.rb ADDED
@@ -0,0 +1,106 @@
1
+ class Time
2
+ # bepaling van de week van het academiejaar
3
+ def week
4
+ t = start_werkjaar(Time.werkjaar)
5
+ return 1 + ((self - t) / (86400*7)).to_int
6
+ end
7
+
8
+ # we bepalen de start van het werkjaar (laatste ma van sept)
9
+ def self.start_werkjaar(jaar)
10
+ t = Time.mktime(jaar, 9, 30)
11
+ t = t - 86400 until t.wday == 1
12
+ t
13
+ end
14
+
15
+ def self.werkjaar
16
+ t = Time.now()
17
+ t > start_werkjaar(t.year) ? t.year : t.year - 1
18
+ end
19
+ end
20
+
21
+ class Fixnum
22
+ # Convenience method
23
+ def weeks
24
+ self * 86400 * 7
25
+ end
26
+ end
27
+
28
+ class Integer
29
+ def to_b
30
+ !zero?
31
+ end
32
+ end
33
+
34
+ class Array
35
+ # File facets/conversion.rb, line 38
36
+ def to_h(arrayed=nil)
37
+ h = {}
38
+ if arrayed #or (flatten.size % 2 == 1)
39
+ #each{ |e| h[e.first] = e.slice(1..-1) }
40
+ each{ |k,*v| h[k] = v }
41
+ else
42
+ h = Hash[*(self.flatten)]
43
+ end
44
+ h
45
+ end
46
+ end
47
+
48
+ class Hash
49
+ # File facets/hash/keyize.rb, line 49
50
+ def normalize_keys!( &block )
51
+ keys.each{ |k|
52
+ nk = block[k]
53
+ self[nk]=delete(k) if nk
54
+ }
55
+ self
56
+ end
57
+ end
58
+
59
+ # XXX MOVE THIS TO BETTER PLACE
60
+
61
+ def send_email(from, from_alias, to, to_alias, subject, message)
62
+ msg = %q{<<END_OF_MESSAGE
63
+ |From: #{from_alias} <#{from}>
64
+ |To: #{to_alias} <#{to}>
65
+ |Subject: #{subject}
66
+
67
+ |#{message}}
68
+
69
+ Net::SMTP.start('localhost') do |smtp|
70
+ smtp.send_message msg, from, to
71
+ end
72
+ end
73
+
74
+ def email(from, to, subject, message)
75
+ from_alias = "#{from.first_name} #{from.last_name}"
76
+ to_alias = "#{to.first_name} #{to.last_name}"
77
+ send_email(from.email, from_alias, to.email, to_alias, subject, message)
78
+ end
79
+
80
+ module ActiveRecord
81
+ class Base
82
+ def self.hash_lookup(search, valid_keys)
83
+ search = search.to_h unless search.is_a? Hash
84
+
85
+ return find(:all) if search.empty?
86
+
87
+ clauses = []
88
+ values = []
89
+ search.normalize_keys! { |k| k.to_s.downcase }
90
+
91
+ search.each do |k, v|
92
+ raise "Invalid search key '#{k}'" unless valid_keys.include? k
93
+ if %w(barcode username).include? k or k == primary_key
94
+ clauses << "#{k} = ?"
95
+ values << v
96
+ else
97
+ clauses << "#{k} like ?"
98
+ v = "%#{v}%"
99
+ values << v
100
+ end
101
+ end
102
+
103
+ find(:all, :conditions => [ clauses.join(" AND "), *values ])
104
+ end
105
+ end
106
+ end