ramaze.ch.oddb.org 1.0.0

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.
Files changed (286) hide show
  1. data/History.txt +6 -0
  2. data/LICENSE +339 -0
  3. data/Manifest.txt +285 -0
  4. data/README.txt +45 -0
  5. data/Rakefile +28 -0
  6. data/bin/admin +69 -0
  7. data/bin/exportd +63 -0
  8. data/bin/migrate +461 -0
  9. data/bin/oddbd +62 -0
  10. data/data/fulltext/data/dicts/french/fulltext.aff +1057 -0
  11. data/data/fulltext/data/dicts/french/fulltext.dict +91189 -0
  12. data/data/fulltext/data/dicts/french/fulltext.stop +135 -0
  13. data/data/fulltext/data/dicts/german/fulltext.aff +1233 -0
  14. data/data/fulltext/data/dicts/german/fulltext.dict +287574 -0
  15. data/data/fulltext/data/dicts/german/fulltext.stop +133 -0
  16. data/data/fulltext/data/german_compound/README +15 -0
  17. data/data/fulltext/data/german_compound/compound.pl +63 -0
  18. data/data/fulltext/data/german_compound/german.stop +20 -0
  19. data/data/fulltext/data/ispell-german-compound.tar.gz +0 -0
  20. data/data/fulltext/redist/dict_french/Makefile +12 -0
  21. data/data/fulltext/redist/dict_french/README.french +1 -0
  22. data/data/fulltext/redist/dict_french/dict_french.sql.in +7 -0
  23. data/data/fulltext/redist/dict_french/dict_snowball.c +56 -0
  24. data/data/fulltext/redist/dict_french/french_stem.c +1222 -0
  25. data/data/fulltext/redist/dict_french/french_stem.h +16 -0
  26. data/data/fulltext/redist/dict_french/subinclude.h +2 -0
  27. data/data/fulltext/redist/dict_german/Makefile +12 -0
  28. data/data/fulltext/redist/dict_german/README.german +1 -0
  29. data/data/fulltext/redist/dict_german/dict_german.sql.in +7 -0
  30. data/data/fulltext/redist/dict_german/dict_snowball.c +56 -0
  31. data/data/fulltext/redist/dict_german/german_stem.c +527 -0
  32. data/data/fulltext/redist/dict_german/german_stem.h +16 -0
  33. data/data/fulltext/redist/dict_german/subinclude.h +1 -0
  34. data/data/fulltext/redist/french_stem.c +1222 -0
  35. data/data/fulltext/redist/french_stem.h +16 -0
  36. data/data/fulltext/redist/german_stem.c +527 -0
  37. data/data/fulltext/redist/german_stem.h +16 -0
  38. data/lib/fixes/ruby19.rb +21 -0
  39. data/lib/fixes/selenium.rb +20 -0
  40. data/lib/fixes/singular.rb +8 -0
  41. data/lib/fixes/yaml.rb +13 -0
  42. data/lib/oddb.rb +11 -0
  43. data/lib/oddb/business/company.rb +18 -0
  44. data/lib/oddb/business/invoice.rb +75 -0
  45. data/lib/oddb/business/price.rb +60 -0
  46. data/lib/oddb/config.rb +73 -0
  47. data/lib/oddb/drugs.rb +16 -0
  48. data/lib/oddb/drugs/active_agent.rb +37 -0
  49. data/lib/oddb/drugs/atc.rb +53 -0
  50. data/lib/oddb/drugs/composition.rb +41 -0
  51. data/lib/oddb/drugs/ddd.rb +24 -0
  52. data/lib/oddb/drugs/dose.rb +107 -0
  53. data/lib/oddb/drugs/galenic_form.rb +21 -0
  54. data/lib/oddb/drugs/galenic_group.rb +17 -0
  55. data/lib/oddb/drugs/package.rb +87 -0
  56. data/lib/oddb/drugs/part.rb +56 -0
  57. data/lib/oddb/drugs/product.rb +25 -0
  58. data/lib/oddb/drugs/sequence.rb +61 -0
  59. data/lib/oddb/drugs/substance.rb +31 -0
  60. data/lib/oddb/drugs/substance_group.rb +13 -0
  61. data/lib/oddb/drugs/unit.rb +12 -0
  62. data/lib/oddb/export.rb +4 -0
  63. data/lib/oddb/export/csv.rb +89 -0
  64. data/lib/oddb/export/l10n_sessions.rb +30 -0
  65. data/lib/oddb/export/rss.rb +44 -0
  66. data/lib/oddb/export/server.rb +58 -0
  67. data/lib/oddb/export/xls.rb +119 -0
  68. data/lib/oddb/export/yaml.rb +123 -0
  69. data/lib/oddb/html/state/drugs/admin/package.rb +189 -0
  70. data/lib/oddb/html/state/drugs/admin/product.rb +56 -0
  71. data/lib/oddb/html/state/drugs/admin/sequence.rb +259 -0
  72. data/lib/oddb/html/state/drugs/ajax/explain_ddd_price.rb +19 -0
  73. data/lib/oddb/html/state/drugs/ajax/explain_price.rb +19 -0
  74. data/lib/oddb/html/state/drugs/ajax/global.rb +18 -0
  75. data/lib/oddb/html/state/drugs/ajax/package_infos.rb +19 -0
  76. data/lib/oddb/html/state/drugs/ajax/remote_infos.rb +19 -0
  77. data/lib/oddb/html/state/drugs/atc_browser.rb +39 -0
  78. data/lib/oddb/html/state/drugs/atc_guidelines.rb +21 -0
  79. data/lib/oddb/html/state/drugs/compare.rb +52 -0
  80. data/lib/oddb/html/state/drugs/download_export.rb +18 -0
  81. data/lib/oddb/html/state/drugs/fachinfo.rb +21 -0
  82. data/lib/oddb/html/state/drugs/feedback.rb +94 -0
  83. data/lib/oddb/html/state/drugs/global.rb +266 -0
  84. data/lib/oddb/html/state/drugs/init.rb +18 -0
  85. data/lib/oddb/html/state/drugs/login.rb +17 -0
  86. data/lib/oddb/html/state/drugs/package.rb +32 -0
  87. data/lib/oddb/html/state/drugs/patinfo.rb +21 -0
  88. data/lib/oddb/html/state/drugs/products.rb +51 -0
  89. data/lib/oddb/html/state/drugs/result.rb +125 -0
  90. data/lib/oddb/html/state/global.rb +165 -0
  91. data/lib/oddb/html/state/global_predefine.rb +17 -0
  92. data/lib/oddb/html/state/limit.rb +17 -0
  93. data/lib/oddb/html/state/login.rb +56 -0
  94. data/lib/oddb/html/state/paypal/checkout.rb +130 -0
  95. data/lib/oddb/html/state/paypal/collect.rb +46 -0
  96. data/lib/oddb/html/state/paypal/redirect.rb +18 -0
  97. data/lib/oddb/html/state/register_export.rb +38 -0
  98. data/lib/oddb/html/state/register_poweruser.rb +17 -0
  99. data/lib/oddb/html/state/viral/admin.rb +76 -0
  100. data/lib/oddb/html/state/viral/poweruser.rb +16 -0
  101. data/lib/oddb/html/util/annotated_list.rb +39 -0
  102. data/lib/oddb/html/util/know_it_all.rb +28 -0
  103. data/lib/oddb/html/util/known_user.rb +55 -0
  104. data/lib/oddb/html/util/lookandfeel.rb +554 -0
  105. data/lib/oddb/html/util/need_all_input.rb +29 -0
  106. data/lib/oddb/html/util/session.rb +88 -0
  107. data/lib/oddb/html/util/sort.rb +72 -0
  108. data/lib/oddb/html/util/unsaved_helper.rb +20 -0
  109. data/lib/oddb/html/util/validator.rb +54 -0
  110. data/lib/oddb/html/view/ajax/json.rb +22 -0
  111. data/lib/oddb/html/view/alpha_header.rb +28 -0
  112. data/lib/oddb/html/view/document.rb +126 -0
  113. data/lib/oddb/html/view/drugs/admin/package.rb +237 -0
  114. data/lib/oddb/html/view/drugs/admin/product.rb +104 -0
  115. data/lib/oddb/html/view/drugs/admin/sequence.rb +312 -0
  116. data/lib/oddb/html/view/drugs/ajax/explain_ddd_price.rb +87 -0
  117. data/lib/oddb/html/view/drugs/ajax/explain_price.rb +61 -0
  118. data/lib/oddb/html/view/drugs/ajax/package_infos.rb +105 -0
  119. data/lib/oddb/html/view/drugs/ajax/remote_infos.rb +44 -0
  120. data/lib/oddb/html/view/drugs/atc_browser.rb +68 -0
  121. data/lib/oddb/html/view/drugs/atc_guidelines.rb +94 -0
  122. data/lib/oddb/html/view/drugs/compare.rb +95 -0
  123. data/lib/oddb/html/view/drugs/download_export.rb +28 -0
  124. data/lib/oddb/html/view/drugs/fachinfo.rb +46 -0
  125. data/lib/oddb/html/view/drugs/feedback.rb +231 -0
  126. data/lib/oddb/html/view/drugs/init.rb +51 -0
  127. data/lib/oddb/html/view/drugs/legend.rb +24 -0
  128. data/lib/oddb/html/view/drugs/package.rb +398 -0
  129. data/lib/oddb/html/view/drugs/patinfo.rb +46 -0
  130. data/lib/oddb/html/view/drugs/products.rb +97 -0
  131. data/lib/oddb/html/view/drugs/result.rb +296 -0
  132. data/lib/oddb/html/view/drugs/search.rb +33 -0
  133. data/lib/oddb/html/view/drugs/template.rb +15 -0
  134. data/lib/oddb/html/view/foot.rb +52 -0
  135. data/lib/oddb/html/view/google.rb +23 -0
  136. data/lib/oddb/html/view/google_ads.rb +40 -0
  137. data/lib/oddb/html/view/head.rb +78 -0
  138. data/lib/oddb/html/view/limit.rb +109 -0
  139. data/lib/oddb/html/view/list.rb +59 -0
  140. data/lib/oddb/html/view/login.rb +38 -0
  141. data/lib/oddb/html/view/navigation.rb +67 -0
  142. data/lib/oddb/html/view/offset_header.rb +35 -0
  143. data/lib/oddb/html/view/paypal/collect.rb +84 -0
  144. data/lib/oddb/html/view/paypal/redirect.rb +51 -0
  145. data/lib/oddb/html/view/paypal/register_form.rb +106 -0
  146. data/lib/oddb/html/view/register_export.rb +29 -0
  147. data/lib/oddb/html/view/register_poweruser.rb +29 -0
  148. data/lib/oddb/html/view/rss/feedback.rb +64 -0
  149. data/lib/oddb/html/view/rss_preview.rb +54 -0
  150. data/lib/oddb/html/view/search.rb +104 -0
  151. data/lib/oddb/html/view/snapback.rb +24 -0
  152. data/lib/oddb/html/view/template.rb +56 -0
  153. data/lib/oddb/import/excel.rb +45 -0
  154. data/lib/oddb/import/import.rb +39 -0
  155. data/lib/oddb/import/rtf.rb +410 -0
  156. data/lib/oddb/import/whocc.rb +173 -0
  157. data/lib/oddb/import/xml.rb +15 -0
  158. data/lib/oddb/model.rb +179 -0
  159. data/lib/oddb/persistence/odba.rb +33 -0
  160. data/lib/oddb/persistence/odba/business/company.rb +13 -0
  161. data/lib/oddb/persistence/odba/business/invoice.rb +15 -0
  162. data/lib/oddb/persistence/odba/drugs/atc.rb +15 -0
  163. data/lib/oddb/persistence/odba/drugs/galenic_form.rb +18 -0
  164. data/lib/oddb/persistence/odba/drugs/galenic_group.rb +13 -0
  165. data/lib/oddb/persistence/odba/drugs/package.rb +25 -0
  166. data/lib/oddb/persistence/odba/drugs/product.rb +13 -0
  167. data/lib/oddb/persistence/odba/drugs/sequence.rb +21 -0
  168. data/lib/oddb/persistence/odba/drugs/substance.rb +21 -0
  169. data/lib/oddb/persistence/odba/drugs/substance_group.rb +13 -0
  170. data/lib/oddb/persistence/odba/drugs/unit.rb +13 -0
  171. data/lib/oddb/persistence/odba/export.rb +26 -0
  172. data/lib/oddb/persistence/odba/model.rb +68 -0
  173. data/lib/oddb/persistence/odba/regulatory/authority.rb +13 -0
  174. data/lib/oddb/persistence/odba/regulatory/registration.rb +13 -0
  175. data/lib/oddb/persistence/odba/text/document.rb +11 -0
  176. data/lib/oddb/persistence/odba/util/code.rb +11 -0
  177. data/lib/oddb/persistence/odba/util/m10l_document.rb +13 -0
  178. data/lib/oddb/persistence/og.rb +16 -0
  179. data/lib/oddb/persistence/og/drugs/composition.rb +14 -0
  180. data/lib/oddb/persistence/og/drugs/product.rb +14 -0
  181. data/lib/oddb/persistence/og/drugs/sequence.rb +15 -0
  182. data/lib/oddb/persistence/og/model.rb +25 -0
  183. data/lib/oddb/persistence/og/util/multilingual.rb +13 -0
  184. data/lib/oddb/redist/rtf_tools/reader.rb +139 -0
  185. data/lib/oddb/regulatory/authority.rb +14 -0
  186. data/lib/oddb/regulatory/registration.rb +15 -0
  187. data/lib/oddb/remote/business/company.rb +23 -0
  188. data/lib/oddb/remote/drugs/active_agent.rb +27 -0
  189. data/lib/oddb/remote/drugs/atc.rb +32 -0
  190. data/lib/oddb/remote/drugs/dose.rb +8 -0
  191. data/lib/oddb/remote/drugs/galenic_form.rb +25 -0
  192. data/lib/oddb/remote/drugs/package.rb +126 -0
  193. data/lib/oddb/remote/drugs/part.rb +30 -0
  194. data/lib/oddb/remote/drugs/product.rb +19 -0
  195. data/lib/oddb/remote/drugs/sequence.rb +46 -0
  196. data/lib/oddb/remote/drugs/substance.rb +20 -0
  197. data/lib/oddb/remote/drugs/unit.rb +19 -0
  198. data/lib/oddb/remote/object.rb +36 -0
  199. data/lib/oddb/remote/text/document.rb +20 -0
  200. data/lib/oddb/remote/util/m10l_document.rb +22 -0
  201. data/lib/oddb/text/chapter.rb +27 -0
  202. data/lib/oddb/text/document.rb +43 -0
  203. data/lib/oddb/text/format.rb +37 -0
  204. data/lib/oddb/text/paragraph.rb +58 -0
  205. data/lib/oddb/text/picture.rb +93 -0
  206. data/lib/oddb/text/table.rb +68 -0
  207. data/lib/oddb/util.rb +8 -0
  208. data/lib/oddb/util/annotated_list.rb +37 -0
  209. data/lib/oddb/util/code.rb +69 -0
  210. data/lib/oddb/util/comparison.rb +36 -0
  211. data/lib/oddb/util/exporter.rb +8 -0
  212. data/lib/oddb/util/feedback.rb +23 -0
  213. data/lib/oddb/util/ipn.rb +48 -0
  214. data/lib/oddb/util/m10l_document.rb +38 -0
  215. data/lib/oddb/util/mail.rb +73 -0
  216. data/lib/oddb/util/money.rb +60 -0
  217. data/lib/oddb/util/multilingual.rb +70 -0
  218. data/lib/oddb/util/quanty.rb +4 -0
  219. data/lib/oddb/util/quanty/fact.rb +229 -0
  220. data/lib/oddb/util/quanty/main.rb +160 -0
  221. data/lib/oddb/util/quanty/parse.rb +853 -0
  222. data/lib/oddb/util/quanty/units.dump +0 -0
  223. data/lib/oddb/util/server.rb +117 -0
  224. data/lib/oddb/util/updater.rb +41 -0
  225. data/lib/oddb/util/ydim.rb +110 -0
  226. data/lib/oddb/util/yus.rb +46 -0
  227. data/test/business/test_company.rb +29 -0
  228. data/test/business/test_price.rb +46 -0
  229. data/test/drugs/test_active_agent.rb +53 -0
  230. data/test/drugs/test_atc.rb +54 -0
  231. data/test/drugs/test_composition.rb +88 -0
  232. data/test/drugs/test_ddd.rb +22 -0
  233. data/test/drugs/test_dose.rb +190 -0
  234. data/test/drugs/test_galenic_form.rb +41 -0
  235. data/test/drugs/test_package.rb +173 -0
  236. data/test/drugs/test_part.rb +32 -0
  237. data/test/drugs/test_product.rb +31 -0
  238. data/test/drugs/test_sequence.rb +140 -0
  239. data/test/drugs/test_substance.rb +51 -0
  240. data/test/drugs/test_substance_group.rb +27 -0
  241. data/test/export/test_rss.rb +94 -0
  242. data/test/export/test_server.rb +117 -0
  243. data/test/export/test_xls.rb +152 -0
  244. data/test/export/test_yaml.rb +120 -0
  245. data/test/import/data/html/whocc/A.html +56 -0
  246. data/test/import/data/html/whocc/A03.html +48 -0
  247. data/test/import/data/html/whocc/A03AB.html +48 -0
  248. data/test/import/data/html/whocc/A06AA.html +47 -0
  249. data/test/import/data/html/whocc/C03.html +47 -0
  250. data/test/import/data/html/whocc/login.html +77 -0
  251. data/test/import/data/xml/ATC_2006.xml +47 -0
  252. data/test/import/data/xml/ATC_2006_ddd.xml +35 -0
  253. data/test/import/test_excel.rb +34 -0
  254. data/test/import/test_rtf.rb +40 -0
  255. data/test/import/test_whocc.rb +315 -0
  256. data/test/remote/drugs/test_active_agent.rb +36 -0
  257. data/test/selenium/selenium-server.jar +0 -0
  258. data/test/selenium/test_atc_browser.rb +122 -0
  259. data/test/selenium/test_atc_guidelines.rb +96 -0
  260. data/test/selenium/test_collect.rb +138 -0
  261. data/test/selenium/test_compare.rb +206 -0
  262. data/test/selenium/test_fachinfo.rb +130 -0
  263. data/test/selenium/test_feedback.rb +196 -0
  264. data/test/selenium/test_init.rb +52 -0
  265. data/test/selenium/test_limit.rb +305 -0
  266. data/test/selenium/test_login.rb +67 -0
  267. data/test/selenium/test_package.rb +512 -0
  268. data/test/selenium/test_patinfo.rb +131 -0
  269. data/test/selenium/test_product.rb +80 -0
  270. data/test/selenium/test_products.rb +142 -0
  271. data/test/selenium/test_search.rb +715 -0
  272. data/test/selenium/test_sequence.rb +543 -0
  273. data/test/selenium/unit.rb +185 -0
  274. data/test/stub/http_server.rb +169 -0
  275. data/test/stub/model.rb +173 -0
  276. data/test/suite.rb +15 -0
  277. data/test/test_model.rb +83 -0
  278. data/test/util/test_code.rb +74 -0
  279. data/test/util/test_ipn.rb +117 -0
  280. data/test/util/test_mail.rb +86 -0
  281. data/test/util/test_multilingual.rb +97 -0
  282. data/test/util/test_server.rb +48 -0
  283. data/test/util/test_updater.rb +353 -0
  284. data/test/util/test_ydim.rb +115 -0
  285. data/test/util/test_yus.rb +79 -0
  286. metadata +418 -0
@@ -0,0 +1,36 @@
1
+ #!/usr/bin/env ruby
2
+ # Util::Comparison -- de.oddb.org -- 13.03.2007 -- hwyss@ywesee.com
3
+
4
+ require 'delegate'
5
+
6
+ module ODDB
7
+ module Util
8
+ class Comparison < SimpleDelegator
9
+ attr_reader :difference, :absolute, :factor,
10
+ :difference_exfactory, :absolute_exfactory, :factor_exfactory
11
+ def initialize(package, original)
12
+ @package = package
13
+ psize = package.size.to_f
14
+ pprice = package.price(:public).to_f
15
+ osize = original.size.to_f
16
+ oprice = original.price(:public).to_f
17
+ unless((psize * pprice * osize * oprice) == 0)
18
+ @factor = psize / osize
19
+ @absolute = pprice - oprice
20
+ @difference = ((osize * pprice) / (psize * oprice) - 1) * 100
21
+ end
22
+ pprice = package.price(:exfactory).to_f
23
+ oprice = original.price(:exfactory).to_f
24
+ unless((psize * pprice * osize * oprice) == 0)
25
+ @factor_exfactory = psize / osize
26
+ @absolute_exfactory = pprice - oprice
27
+ @difference_exfactory = ((osize * pprice) / (psize * oprice) - 1) * 100
28
+ end
29
+ super(package)
30
+ end
31
+ def is_a?(mod)
32
+ super || @package.is_a?(mod)
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+ # Util::Exporter -- de.oddb.org -- 02.10.2007 -- hwyss@ywesee.com
3
+
4
+ require 'drb'
5
+
6
+ module ODDB
7
+ @exporter = DRb::DRbObject.new(nil, @config.server_url_export)
8
+ end
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env ruby
2
+ # Util::Feedback -- de.oddb.org -- 06.12.2007 -- hwyss@ywesee.com
3
+
4
+ require 'oddb/model'
5
+
6
+ module ODDB
7
+ module Util
8
+ class Feedback < Model
9
+ belongs_to :item
10
+ attr_accessor :name, :email, :message, :email_public, :item_good_experience,
11
+ :item_recommended, :item_good_impression, :item_helps, :time
12
+ def self.newest(count=5)
13
+ sorted = all.sort_by { |instance| -instance.time.to_f }
14
+ case count
15
+ when Integer
16
+ sorted[0,count]
17
+ else
18
+ sorted
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,48 @@
1
+ #!/usr/bin/env ruby
2
+ # Util::Ipn -- de.oddb.org -- 29.01.2008 -- hwyss@ywesee.com
3
+
4
+ require 'oddb/business/invoice'
5
+ require 'oddb/util/mail'
6
+ require 'oddb/util/ydim'
7
+ require 'oddb/util/yus'
8
+
9
+ module ODDB
10
+ module Util
11
+ module Ipn
12
+ def Ipn.process(notification)
13
+ id = notification.params["invoice"]
14
+ invoice = Business::Invoice.find_by_id(id) or raise "unknown invoice '#{id}'"
15
+ invoice.status = notification.status.to_s.downcase
16
+ if(notification.complete?)
17
+ Ipn.process_invoice(invoice)
18
+ else
19
+ invoice.ipn = notification
20
+ end
21
+ invoice.save
22
+ invoice
23
+ end
24
+ def Ipn.process_invoice(invoice)
25
+ invoice.items.each { |item| Ipn.process_item invoice, item }
26
+ Ydim.inject(invoice, :payment_received => true)
27
+ Mail.notify_invoice(invoice)
28
+ end
29
+ def Ipn.process_item(invoice, item)
30
+ case item.type
31
+ when :poweruser
32
+ yus_name = invoice.yus_name
33
+ item.expiry_time = Time.now + (60 * 60 * 24 * item.quantity)
34
+ Util::Yus.set_preference(yus_name, 'poweruser_duration', item.quantity)
35
+ Util::Yus.grant(yus_name, 'login', "#{ODDB.config.auth_domain}.PowerUser")
36
+ Util::Yus.grant(yus_name, 'view', ODDB.config.auth_domain, item.expiry_time)
37
+ when :export
38
+ yus_name = invoice.yus_name
39
+ item.expiry_time = Time.now + (60 * 60 * 24)
40
+ Util::Yus.grant(yus_name, 'login', "#{ODDB.config.auth_domain}.PowerUser")
41
+ Util::Yus.grant(yus_name, 'download',
42
+ "#{ODDB.config.auth_domain}.#{item.text}",
43
+ item.expiry_time)
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,38 @@
1
+ #!/usr/bin/env ruby
2
+ # M10lDocument -- de.oddb.org -- 13.03.2008 -- hwyss@ywesee.com
3
+
4
+ require 'oddb/model'
5
+ require 'oddb/util/multilingual'
6
+
7
+ module ODDB
8
+ module Util
9
+ class M10lDocument < Model
10
+ include M10lMethods
11
+ connector :canonical
12
+ attr_reader :previous_sources
13
+ def initialize(canonical={})
14
+ super
15
+ @previous_sources = {}
16
+ end
17
+ def add_previous_source(lang, source)
18
+ sources = (@previous_sources[lang.to_sym] ||= [])
19
+ sources.push source
20
+ sources.compact!
21
+ sources.uniq!
22
+ sources
23
+ end
24
+ def method_missing(meth, *args, &block)
25
+ case meth.to_s
26
+ when /^([a-z]{2})=$/
27
+ lang = $~[1].to_sym
28
+ if(previous = @canonical[lang])
29
+ add_previous_source(lang, previous.source)
30
+ end
31
+ @canonical.store(lang, args.first)
32
+ else
33
+ super(meth, *args, &block)
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,73 @@
1
+ #!/usr/bin/env ruby
2
+ # Util::Mail -- de.oddb.org -- 06.02.2007 -- hwyss@ywesee.com
3
+
4
+ require 'rmail'
5
+ require 'net/smtp'
6
+ require 'oddb/config'
7
+ require 'oddb/html/util/lookandfeel'
8
+ require 'oddb/util/yus'
9
+
10
+ module ODDB
11
+ module Util
12
+ module Mail
13
+ def Mail.notify_admins(subject, lines)
14
+ config = ODDB.config
15
+ recipients = config.admins
16
+ mpart = RMail::Message.new
17
+ header = mpart.header
18
+ header.to = recipients
19
+ header.from = config.mail_from
20
+ header.subject = subject
21
+ header.date = Time.now
22
+ header.add('Content-Type', 'text/plain', nil,
23
+ 'charset' => config.mail_charset)
24
+ mpart.body = lines.join("\n")
25
+ sendmail(mpart, config.smtp_from, recipients)
26
+ end
27
+ def Mail.notify_invoice(invoice)
28
+ config = ODDB.config
29
+ lnf = Html::Util::LookandfeelStub.new('de')
30
+ mpart = RMail::Message.new
31
+ header = mpart.header
32
+ header.to = recipient = invoice.yus_name
33
+ header.from = config.mail_invoice_from
34
+ header.subject = lnf.lookup(:poweruser_mail_subject)
35
+ header.date = Time.now
36
+ header.add('Content-Type', 'text/plain', nil,
37
+ 'charset' => config.mail_charset)
38
+ recipients = [recipient].concat config.debug_recipients
39
+ yus = Util::Yus.get_preferences(recipient, :salutation, :name_last)
40
+ parts = [
41
+ lnf.lookup(:poweruser_mail_salut, lnf.lookup(yus[:salutation]),
42
+ yus[:name_last]),
43
+ ]
44
+ invoice.items.each { |item|
45
+ case item.type
46
+ when :poweruser
47
+ days = item.quantity
48
+ duration = (days == 1) \
49
+ ? lnf.lookup(:days_one_genitive) \
50
+ : lnf.lookup(:days_genitive, days)
51
+ parts.push lnf.lookup(:poweruser_mail_body)
52
+ parts.push lnf.lookup(:poweruser_mail_instr,
53
+ duration, lnf._event_url(:login))
54
+ when :export
55
+ parts.push lnf.lookup(:download_export_mail_body)
56
+ parts.push lnf.lookup(:download_export_mail_instr)
57
+ parts.push lnf._event_url(:collect, [:invoice, invoice.id])
58
+ end
59
+ }
60
+ mpart.body = parts.join("\n\n")
61
+ sendmail(mpart, config.mail_invoice_smtp, recipients)
62
+ end
63
+ def Mail.sendmail(mpart, from, recipients)
64
+ smtp = Net::SMTP.new(ODDB.config.smtp_server)
65
+ smtp.start {
66
+ recipients.each { |recipient|
67
+ smtp.sendmail(mpart.to_s, from, recipient)
68
+ }
69
+ }
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,60 @@
1
+ #!/usr/bin/env ruby
2
+ # Util::Money -- de.oddb.org -- 14.11.2006 -- hwyss@ywesee.com
3
+
4
+ module ODDB
5
+ module Util
6
+ class Money
7
+ attr_reader :credits, :valid_from
8
+ include Comparable
9
+ class << self
10
+ def five
11
+ @five ||= self.new(5)
12
+ end
13
+ def ten
14
+ @ten ||= self.new(10)
15
+ end
16
+ end
17
+ def initialize(amount)
18
+ self.amount = amount
19
+ @valid_from = Time.now
20
+ end
21
+ def amount=(amount)
22
+ @amount = amount.to_f
23
+ @credits = (@amount * 100).round
24
+ end
25
+ def is_for?(type, country)
26
+ @type == type.to_s.downcase && @country == country.to_s.upcase
27
+ end
28
+ def to_f
29
+ @amount || (@credits.to_f / 100)
30
+ end
31
+ def to_s
32
+ sprintf("%1.2f", to_f)
33
+ end
34
+ def valid_from=(time)
35
+ raise ArgumentError unless time.is_a?(Time)
36
+ @valid_from = time
37
+ end
38
+ def +(other)
39
+ Money.new((@amount || to_f) + other.to_f)
40
+ end
41
+ def -(other)
42
+ Money.new((@amount || to_f) - other.to_f)
43
+ end
44
+ def *(other)
45
+ Money.new((@amount || to_f) * other.to_f)
46
+ end
47
+ def /(other)
48
+ Money.new((@amount || to_f) / other.to_f)
49
+ end
50
+ def <=>(other)
51
+ case other
52
+ when Money
53
+ @credits <=> other.credits
54
+ else
55
+ to_f <=> other.to_f
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,70 @@
1
+ #!/usr/bin/env ruby
2
+ # Util::Multilingual -- de.oddb.org -- 04.09.2006 -- hwyss@ywesee.com
3
+
4
+ module ODDB
5
+ module Util
6
+ module M10lMethods
7
+ include Comparable
8
+ attr_reader :canonical
9
+ attr_reader :synonyms
10
+ def initialize(canonical={})
11
+ @canonical = canonical
12
+ end
13
+ def all
14
+ @canonical.values
15
+ end
16
+ def empty?
17
+ @canonical.empty?
18
+ end
19
+ def method_missing(meth, *args, &block)
20
+ case meth.to_s
21
+ when /^[a-z]{2}$/
22
+ @canonical[meth]
23
+ when /^([a-z]{2})=$/
24
+ @canonical.store($~[1].to_sym, args.first)
25
+ else
26
+ super(meth, *args, &block)
27
+ end
28
+ end
29
+ def to_s
30
+ @canonical.values.sort.first.to_s
31
+ end
32
+ def ==(other)
33
+ case other
34
+ when String
35
+ @canonical.values.any? { |val| val == other } \
36
+ || @synonyms.any? { |val| val == other }
37
+ when M10lDocument
38
+ @canonical == other.canonical && @synonyms == other.synonyms
39
+ when M10lMethods
40
+ @canonical == other.canonical
41
+ else
42
+ false
43
+ end
44
+ end
45
+ def <=>(other)
46
+ all.sort <=> other.all.sort
47
+ end
48
+ end
49
+ class Multilingual
50
+ include M10lMethods
51
+ def initialize(canonical={})
52
+ super
53
+ @synonyms = []
54
+ end
55
+ def add_synonym(synonym)
56
+ @synonyms.push(synonym).uniq! && synonym
57
+ end
58
+ def all
59
+ terms = super.concat(@synonyms)
60
+ terms.concat(terms.collect do |term| term.gsub(/[^\w]/, '') end)
61
+ terms.uniq
62
+ end
63
+ def merge(other)
64
+ @synonyms.concat(other.all).uniq!
65
+ end
66
+ end
67
+ end
68
+ end
69
+
70
+ require 'oddb/util/m10l_document'
@@ -0,0 +1,4 @@
1
+ # encoding: utf-8
2
+ require 'oddb/util/quanty/parse'
3
+ require 'oddb/util/quanty/fact'
4
+ require 'oddb/util/quanty/main'
@@ -0,0 +1,229 @@
1
+ # encoding: utf-8
2
+ #
3
+ # quanty/fact.rb
4
+ #
5
+ # Copyright (c) 2001 Masahiro Tanaka <masa@ir.isas.ac.jp>
6
+ #
7
+ # This program is free software.
8
+ # You can distribute/modify this program under the terms of
9
+ # the GNU General Public License version 2 or later.
10
+
11
+ class Quanty
12
+
13
+ class Fact < Hash
14
+ Self = self
15
+ Parser = Parse.new
16
+
17
+ attr_reader :factor
18
+
19
+ # Basic units: Fact.new("m",true) => {"m"=>1}
20
+ # Derivative units: Fact.new("km") => 1000*{"m"=>1}
21
+ def initialize(key=nil,base=false)
22
+ self.default = 0.0
23
+ @factor = 1.0
24
+ case key
25
+ when Numeric
26
+ @factor = key
27
+ when String
28
+ if base
29
+ store(key, 1.0)
30
+ else
31
+ decomp(key)
32
+ end
33
+ when Self
34
+ replace(key)
35
+ end
36
+ end
37
+
38
+ def []=(key,val)
39
+ if val == 0
40
+ delete(key)
41
+ else
42
+ super(key,val)
43
+ end
44
+ end
45
+
46
+ def replace(other)
47
+ @factor = other.factor
48
+ super(other)
49
+ end
50
+
51
+ def dup
52
+ Fact.new(self)
53
+ end
54
+
55
+ def find_prefix(a,n)
56
+ Prefix.each{ |key,factor|
57
+ if /^#{key}-?/u =~ a && (unit = List[b=$']) && b.size>n
58
+ #p [a,b,factor]
59
+ return Fact.new(b).fac!(factor)
60
+ end
61
+ }
62
+ nil
63
+ end
64
+
65
+ def decomp(a)
66
+ if /^([µA-Za-z_]+([A-Za-z_0-9-]+[A-Za-z_])?)$|^[$%'"]'?$/ou =~ a
67
+ #if /^[A-Za-z_0-9$%-]+$/o =~ a
68
+ unit = List[a] || find_prefix(a,0) ||
69
+ if a.size>3 && /chs$/ou !~ a && /(.*[a-rt-y])s$/ou =~ a
70
+ b = $1
71
+ List[b] || find_prefix(b,2) ||
72
+ if a.size>4 && /(.*s|.*z|.*ch)es$/ou =~ a
73
+ b = $1
74
+ List[b] || find_prefix(b,2)
75
+ end
76
+ end
77
+ else
78
+ unit = Parser.parse(a)
79
+ end
80
+ unless unit
81
+ raise "`%s': unknown unit"%a
82
+ end
83
+ @factor *= factor if factor
84
+ mul!(unit)
85
+ end
86
+
87
+ def mul!(other)
88
+ raise unless other.kind_of?(Fact)
89
+ other.each{ |key,val| self[key] += val }
90
+ delete_if{ |key,val| val == 0 }
91
+ @factor *= other.factor
92
+ self
93
+ end
94
+
95
+ def * (other)
96
+ dup.mul!(other)
97
+ end
98
+
99
+ def div!(other)
100
+ raise unless other.kind_of?(Fact)
101
+ other.each{ |key,val| self[key] -= val }
102
+ delete_if{ |key,val| val == 0 }
103
+ @factor /= other.factor
104
+ self
105
+ end
106
+
107
+ def / (other)
108
+ dup.div!(other)
109
+ end
110
+
111
+ def pow!(other)
112
+ raise unless other.kind_of?(Numeric)
113
+ each{ |key,val| self[key] = other*val }
114
+ @factor **= other
115
+ self
116
+ end
117
+
118
+ def ** (other)
119
+ dup.pow!(other)
120
+ end
121
+
122
+ def fac!(other)
123
+ raise unless other.kind_of?(Numeric)
124
+ @factor *= other
125
+ self
126
+ end
127
+
128
+ def inspect
129
+ @factor.to_s+"*"+super
130
+ end
131
+
132
+ def to_s
133
+ a = []
134
+ each{|k,v|
135
+ if v != 1
136
+ v = v.to_i if v%1 == 0
137
+ k += v.to_s
138
+ end
139
+ a.push k
140
+ }
141
+ @factor.to_s+" "+a.join(" ")
142
+ end
143
+
144
+ def null?
145
+ each_value{ |val| return false if val != 0 }
146
+ true
147
+ end
148
+
149
+ alias __equal__ :==
150
+
151
+ def ==(other)
152
+ if other.kind_of?(Numeric)
153
+ null? && @factor==other
154
+ else
155
+ __equal__(other) && @factor==other.factor
156
+ end
157
+ end
158
+
159
+ # check only dimension
160
+ def ===(other)
161
+ if other.kind_of?(Numeric)
162
+ null?
163
+ else
164
+ __equal__(other)
165
+ end
166
+ end
167
+
168
+ def to_f
169
+ raise inspect + ": not null unit" unless null?
170
+ @factor
171
+ end
172
+
173
+ class << self
174
+ def mkdump filename
175
+ Prefix.clear
176
+ List.clear
177
+ #s = open("units.succ","w")
178
+ #f = open("units.fail","w")
179
+ open("units.dat","r").readlines.each do |str|
180
+ if /^([µA-Za-z_0-9%$"'-]+)\s+([^#]+)/u =~ str
181
+ name,repr = $1,$2.strip
182
+ # conversion due to the different rule from GNU units:
183
+ # A / B C => A / (B C)
184
+ if /\//u =~ repr #/
185
+ pre,suf = $`,$'.strip
186
+ if /\s/u =~ suf
187
+ repr = pre + ' / (' + suf + ')'
188
+ end
189
+ end
190
+ if repr=="!"
191
+ List[name] = Fact.new(name,true).freeze
192
+ elsif /-$/u =~ name
193
+ Prefix[name[0..-2]] = Prefix[repr] || (List[repr] || repr).to_f
194
+ else
195
+ #p [name,repr]
196
+ List[name] = Fact.new(repr).freeze
197
+ end
198
+ #s.print str
199
+ #rescue
200
+ #f.print str
201
+ end
202
+ end
203
+ #Prefix.each{|key,val| p [key,val]}
204
+ #List.each{|key,val| p [key,val]}
205
+ Marshal.dump( [Prefix, List], open(filename,"w") )
206
+ end
207
+ end
208
+
209
+ end # class Fact
210
+
211
+
212
+ ### Loading unit data ###
213
+ =begin
214
+ fn = nil
215
+ $:.each{ |dir|
216
+ fn = dir + "/quanty/units.dump"
217
+ break if FileTest.exist?( fn )
218
+ fn = nil
219
+ }
220
+ =end
221
+ fn = File.expand_path('units.dump', File.dirname(__FILE__))
222
+ fn = nil unless FileTest.exist?( fn )
223
+ if fn
224
+ Prefix, List = Marshal.load(open(fn,"r"))
225
+ else
226
+ Prefix, List = {},{}
227
+ end
228
+
229
+ end # class Quanty