From cecff5bca12aa6f15dfa3151c25ffa445df6f10e Mon Sep 17 00:00:00 2001 From: Olivier Sarrat Date: Mon, 16 Jan 2017 15:04:22 +0100 Subject: [PATCH] Add used modules for Groupe URD production server --- calendar_ics/__init__.py | 2 + calendar_ics/__init__.pyc | Bin 0 -> 206 bytes calendar_ics/__openerp__.py | 43 ++ calendar_ics/calendar.py | 312 ++++++++++++ calendar_ics/calendar.pyc | Bin 0 -> 7876 bytes calendar_ics/calendar_ics_demo.xml | 76 +++ calendar_ics/calendar_view.xml | 108 +++++ calendar_ics/res_partner - Copie.py | 287 +++++++++++ calendar_ics/res_partner.py | 279 +++++++++++ calendar_ics/res_partner.pyc | Bin 0 -> 9888 bytes calendar_ics/res_partner_data.xml | 29 ++ calendar_ics/res_partner_view.xml | 32 ++ calendar_ics/security/ir.model.access.csv | 3 + google_account/__init__.py | 24 + google_account/__openerp__.py | 41 ++ google_account/controllers/__init__.py | 1 + google_account/controllers/main.py | 32 ++ google_account/google_account.py | 189 ++++++++ google_account/google_account.xml | 9 + google_account/google_account_data.xml | 9 + google_account/i18n/af.po | 49 ++ google_account/i18n/ar.po | 52 ++ google_account/i18n/bg.po | 50 ++ google_account/i18n/bs.po | 49 ++ google_account/i18n/ca.po | 49 ++ google_account/i18n/cs.po | 49 ++ google_account/i18n/da.po | 49 ++ google_account/i18n/de.po | 51 ++ google_account/i18n/el.po | 50 ++ google_account/i18n/en_GB.po | 49 ++ google_account/i18n/es.po | 52 ++ google_account/i18n/es_AR.po | 50 ++ google_account/i18n/es_BO.po | 49 ++ google_account/i18n/es_CL.po | 49 ++ google_account/i18n/es_CO.po | 49 ++ google_account/i18n/es_CR.po | 50 ++ google_account/i18n/es_DO.po | 49 ++ google_account/i18n/es_EC.po | 49 ++ google_account/i18n/es_MX.po | 49 ++ google_account/i18n/es_PA.po | 49 ++ google_account/i18n/es_PE.po | 50 ++ google_account/i18n/es_PY.po | 49 ++ google_account/i18n/es_VE.po | 49 ++ google_account/i18n/et.po | 49 ++ google_account/i18n/eu.po | 50 ++ google_account/i18n/fa.po | 49 ++ google_account/i18n/fi.po | 51 ++ google_account/i18n/fr.po | 51 ++ google_account/i18n/fr_BE.po | 49 ++ google_account/i18n/fr_CA.po | 49 ++ google_account/i18n/gl.po | 49 ++ google_account/i18n/google_account.pot | 48 ++ google_account/i18n/google_base_account.pot | 106 ++++ google_account/i18n/gu.po | 49 ++ google_account/i18n/he.po | 49 ++ google_account/i18n/hi.po | 50 ++ google_account/i18n/hr.po | 50 ++ google_account/i18n/hu.po | 52 ++ google_account/i18n/id.po | 50 ++ google_account/i18n/is.po | 49 ++ google_account/i18n/it.po | 50 ++ google_account/i18n/ja.po | 52 ++ google_account/i18n/ka.po | 49 ++ google_account/i18n/kab.po | 51 ++ google_account/i18n/ko.po | 49 ++ google_account/i18n/ln.po | 49 ++ google_account/i18n/lt.po | 49 ++ google_account/i18n/lv.po | 49 ++ google_account/i18n/mk.po | 51 ++ google_account/i18n/ml_IN.po | 50 ++ google_account/i18n/mn.po | 50 ++ google_account/i18n/nb.po | 50 ++ google_account/i18n/nl.po | 51 ++ google_account/i18n/nl_BE.po | 49 ++ google_account/i18n/pl.po | 50 ++ google_account/i18n/pt.po | 50 ++ google_account/i18n/pt_BR.po | 51 ++ google_account/i18n/ro.po | 50 ++ google_account/i18n/ru.po | 51 ++ google_account/i18n/sk.po | 49 ++ google_account/i18n/sl.po | 51 ++ google_account/i18n/sq.po | 49 ++ google_account/i18n/sr.po | 49 ++ google_account/i18n/sr@latin.po | 50 ++ google_account/i18n/sv.po | 51 ++ google_account/i18n/ta.po | 49 ++ google_account/i18n/th.po | 50 ++ google_account/i18n/tr.po | 50 ++ google_account/i18n/uk.po | 50 ++ google_account/i18n/vi.po | 49 ++ google_account/i18n/zh_CN.po | 51 ++ google_account/i18n/zh_TW.po | 49 ++ mail_tracking/README.rst | 112 +++++ mail_tracking/__init__.py | 8 + mail_tracking/__init__.pyc | Bin 0 -> 294 bytes mail_tracking/__openerp__.py | 32 ++ mail_tracking/controllers/__init__.py | 6 + mail_tracking/controllers/__init__.pyc | Bin 0 -> 204 bytes mail_tracking/controllers/main.py | 86 ++++ mail_tracking/controllers/main.pyc | Bin 0 -> 3465 bytes mail_tracking/data/tracking_data.xml | 13 + mail_tracking/hooks.py | 36 ++ mail_tracking/hooks.pyc | Bin 0 -> 1598 bytes mail_tracking/i18n/am.po | 448 +++++++++++++++++ mail_tracking/i18n/ca.po | 448 +++++++++++++++++ mail_tracking/i18n/de.po | 449 +++++++++++++++++ mail_tracking/i18n/el_GR.po | 448 +++++++++++++++++ mail_tracking/i18n/es.po | 440 +++++++++++++++++ mail_tracking/i18n/es_ES.po | 448 +++++++++++++++++ mail_tracking/i18n/fi.po | 449 +++++++++++++++++ mail_tracking/i18n/fr.po | 448 +++++++++++++++++ mail_tracking/i18n/gl.po | 448 +++++++++++++++++ mail_tracking/i18n/it.po | 448 +++++++++++++++++ mail_tracking/i18n/nl.po | 448 +++++++++++++++++ mail_tracking/i18n/pt.po | 448 +++++++++++++++++ mail_tracking/i18n/pt_BR.po | 448 +++++++++++++++++ mail_tracking/i18n/pt_PT.po | 448 +++++++++++++++++ mail_tracking/i18n/sl.po | 458 ++++++++++++++++++ mail_tracking/i18n/tr.po | 448 +++++++++++++++++ mail_tracking/models/__init__.py | 11 + mail_tracking/models/__init__.pyc | Bin 0 -> 444 bytes mail_tracking/models/ir_mail_server.py | 94 ++++ mail_tracking/models/ir_mail_server.pyc | Bin 0 -> 3878 bytes mail_tracking/models/mail_mail.py | 43 ++ mail_tracking/models/mail_mail.pyc | Bin 0 -> 1902 bytes mail_tracking/models/mail_message.py | 54 +++ mail_tracking/models/mail_message.pyc | Bin 0 -> 2145 bytes mail_tracking/models/mail_tracking_email.py | 312 ++++++++++++ mail_tracking/models/mail_tracking_email.pyc | Bin 0 -> 12602 bytes mail_tracking/models/mail_tracking_event.py | 136 ++++++ mail_tracking/models/mail_tracking_event.pyc | Bin 0 -> 6765 bytes mail_tracking/models/res_partner.py | 46 ++ mail_tracking/models/res_partner.pyc | Bin 0 -> 2024 bytes mail_tracking/security/ir.model.access.csv | 5 + mail_tracking/static/description/icon.png | Bin 0 -> 5896 bytes .../static/src/css/mail_tracking.css | 13 + mail_tracking/static/src/img/delivered.png | Bin 0 -> 285 bytes mail_tracking/static/src/img/error.png | Bin 0 -> 257 bytes mail_tracking/static/src/img/opened.png | Bin 0 -> 368 bytes mail_tracking/static/src/img/sent.png | Bin 0 -> 294 bytes mail_tracking/static/src/img/unknown.png | Bin 0 -> 425 bytes mail_tracking/static/src/img/waiting.png | Bin 0 -> 348 bytes mail_tracking/static/src/js/mail_tracking.js | 62 +++ .../static/src/xml/mail_tracking.xml | 61 +++ mail_tracking/tests/__init__.py | 6 + mail_tracking/tests/test_mail_tracking.py | 261 ++++++++++ mail_tracking/views/assets.xml | 19 + .../views/mail_tracking_email_view.xml | 122 +++++ .../views/mail_tracking_event_view.xml | 125 +++++ mail_tracking/views/res_partner_view.xml | 33 ++ mail_tracking_mailgun/README.rst | 86 ++++ mail_tracking_mailgun/__init__.py | 5 + mail_tracking_mailgun/__init__.pyc | Bin 0 -> 202 bytes mail_tracking_mailgun/__openerp__.py | 18 + mail_tracking_mailgun/i18n/es.po | 24 + mail_tracking_mailgun/i18n/fr.po | 24 + mail_tracking_mailgun/i18n/sl.po | 24 + mail_tracking_mailgun/models/__init__.py | 6 + mail_tracking_mailgun/models/__init__.pyc | Bin 0 -> 269 bytes .../models/ir_mail_server.py | 23 + .../models/ir_mail_server.pyc | Bin 0 -> 969 bytes .../models/mail_tracking_email.py | 194 ++++++++ .../models/mail_tracking_email.pyc | Bin 0 -> 7030 bytes .../static/description/icon.png | Bin 0 -> 6485 bytes .../static/description/icon.svg | 6 + mail_tracking_mailgun/tests/__init__.py | 5 + mail_tracking_mailgun/tests/test_mailgun.py | 281 +++++++++++ mail_tracking_mass_mailing/README.rst | 77 +++ mail_tracking_mass_mailing/__init__.py | 6 + mail_tracking_mass_mailing/__init__.pyc | Bin 0 -> 263 bytes mail_tracking_mass_mailing/__openerp__.py | 28 ++ mail_tracking_mass_mailing/hooks.py | 20 + mail_tracking_mass_mailing/hooks.pyc | Bin 0 -> 797 bytes mail_tracking_mass_mailing/i18n/ca.po | 142 ++++++ mail_tracking_mass_mailing/i18n/de.po | 142 ++++++ mail_tracking_mass_mailing/i18n/es.po | 124 +++++ mail_tracking_mass_mailing/i18n/es_CO.po | 142 ++++++ mail_tracking_mass_mailing/i18n/fr.po | 125 +++++ mail_tracking_mass_mailing/i18n/pt_BR.po | 142 ++++++ mail_tracking_mass_mailing/i18n/sl.po | 127 +++++ mail_tracking_mass_mailing/models/__init__.py | 10 + .../models/__init__.pyc | Bin 0 -> 482 bytes .../models/mail_mail.py | 24 + .../models/mail_mail.pyc | Bin 0 -> 1244 bytes .../models/mail_mail_statistics.py | 16 + .../models/mail_mail_statistics.pyc | Bin 0 -> 901 bytes .../models/mail_mass_mailing.py | 31 ++ .../models/mail_mass_mailing.pyc | Bin 0 -> 1535 bytes .../models/mail_mass_mailing_contact.py | 28 ++ .../models/mail_mass_mailing_contact.pyc | Bin 0 -> 1576 bytes .../models/mail_tracking_email.py | 52 ++ .../models/mail_tracking_email.pyc | Bin 0 -> 2267 bytes .../models/mail_tracking_event.py | 49 ++ .../models/mail_tracking_event.pyc | Bin 0 -> 2525 bytes .../static/description/icon.png | Bin 0 -> 9455 bytes mail_tracking_mass_mailing/tests/__init__.py | 5 + .../tests/test_mass_mailing.py | 113 +++++ .../views/mail_mail_statistics_view.xml | 35 ++ .../views/mail_mass_mailing_contact_view.xml | 19 + .../views/mail_mass_mailing_view.xml | 19 + .../views/mail_tracking_email_view.xml | 20 + smile_access_control/__init__.py | 22 + smile_access_control/__init__.pyc | Bin 0 -> 182 bytes smile_access_control/__openerp__.py | 55 +++ smile_access_control/data/res_users_data.xml | 10 + smile_access_control/i18n/fr.po | 109 +++++ smile_access_control/models/__init__.py | 23 + smile_access_control/models/__init__.pyc | Bin 0 -> 221 bytes smile_access_control/models/res_groups.py | 115 +++++ smile_access_control/models/res_groups.pyc | Bin 0 -> 4594 bytes smile_access_control/models/res_users.py | 130 +++++ smile_access_control/models/res_users.pyc | Bin 0 -> 6754 bytes .../static/description/icon.png | Bin 0 -> 1156 bytes smile_access_control/tests/__init__.py | 24 + .../tests/test_access_control.py | 102 ++++ smile_access_control/tests/test_groups.py | 99 ++++ smile_access_control/tests/test_users.py | 103 ++++ .../views/res_groups_view.xml | 24 + smile_access_control/views/res_users_view.xml | 133 +++++ smile_event_event_calendar/__init__.py | 22 + smile_event_event_calendar/__init__.pyc | Bin 0 -> 188 bytes smile_event_event_calendar/__openerp__.py | 45 ++ smile_event_event_calendar/models/__init__.py | 23 + .../models/__init__.pyc | Bin 0 -> 227 bytes .../models/calendar_event.py | 46 ++ .../models/calendar_event.pyc | Bin 0 -> 1679 bytes smile_event_event_calendar/models/event.py | 70 +++ smile_event_event_calendar/models/event.pyc | Bin 0 -> 2302 bytes .../static/description/icon.png | Bin 0 -> 1156 bytes .../views/calendar_view.xml | 18 + 230 files changed, 17347 insertions(+) create mode 100644 calendar_ics/__init__.py create mode 100644 calendar_ics/__init__.pyc create mode 100644 calendar_ics/__openerp__.py create mode 100644 calendar_ics/calendar.py create mode 100644 calendar_ics/calendar.pyc create mode 100644 calendar_ics/calendar_ics_demo.xml create mode 100644 calendar_ics/calendar_view.xml create mode 100644 calendar_ics/res_partner - Copie.py create mode 100644 calendar_ics/res_partner.py create mode 100644 calendar_ics/res_partner.pyc create mode 100644 calendar_ics/res_partner_data.xml create mode 100644 calendar_ics/res_partner_view.xml create mode 100644 calendar_ics/security/ir.model.access.csv create mode 100644 google_account/__init__.py create mode 100644 google_account/__openerp__.py create mode 100644 google_account/controllers/__init__.py create mode 100644 google_account/controllers/main.py create mode 100644 google_account/google_account.py create mode 100644 google_account/google_account.xml create mode 100644 google_account/google_account_data.xml create mode 100644 google_account/i18n/af.po create mode 100644 google_account/i18n/ar.po create mode 100644 google_account/i18n/bg.po create mode 100644 google_account/i18n/bs.po create mode 100644 google_account/i18n/ca.po create mode 100644 google_account/i18n/cs.po create mode 100644 google_account/i18n/da.po create mode 100644 google_account/i18n/de.po create mode 100644 google_account/i18n/el.po create mode 100644 google_account/i18n/en_GB.po create mode 100644 google_account/i18n/es.po create mode 100644 google_account/i18n/es_AR.po create mode 100644 google_account/i18n/es_BO.po create mode 100644 google_account/i18n/es_CL.po create mode 100644 google_account/i18n/es_CO.po create mode 100644 google_account/i18n/es_CR.po create mode 100644 google_account/i18n/es_DO.po create mode 100644 google_account/i18n/es_EC.po create mode 100644 google_account/i18n/es_MX.po create mode 100644 google_account/i18n/es_PA.po create mode 100644 google_account/i18n/es_PE.po create mode 100644 google_account/i18n/es_PY.po create mode 100644 google_account/i18n/es_VE.po create mode 100644 google_account/i18n/et.po create mode 100644 google_account/i18n/eu.po create mode 100644 google_account/i18n/fa.po create mode 100644 google_account/i18n/fi.po create mode 100644 google_account/i18n/fr.po create mode 100644 google_account/i18n/fr_BE.po create mode 100644 google_account/i18n/fr_CA.po create mode 100644 google_account/i18n/gl.po create mode 100644 google_account/i18n/google_account.pot create mode 100644 google_account/i18n/google_base_account.pot create mode 100644 google_account/i18n/gu.po create mode 100644 google_account/i18n/he.po create mode 100644 google_account/i18n/hi.po create mode 100644 google_account/i18n/hr.po create mode 100644 google_account/i18n/hu.po create mode 100644 google_account/i18n/id.po create mode 100644 google_account/i18n/is.po create mode 100644 google_account/i18n/it.po create mode 100644 google_account/i18n/ja.po create mode 100644 google_account/i18n/ka.po create mode 100644 google_account/i18n/kab.po create mode 100644 google_account/i18n/ko.po create mode 100644 google_account/i18n/ln.po create mode 100644 google_account/i18n/lt.po create mode 100644 google_account/i18n/lv.po create mode 100644 google_account/i18n/mk.po create mode 100644 google_account/i18n/ml_IN.po create mode 100644 google_account/i18n/mn.po create mode 100644 google_account/i18n/nb.po create mode 100644 google_account/i18n/nl.po create mode 100644 google_account/i18n/nl_BE.po create mode 100644 google_account/i18n/pl.po create mode 100644 google_account/i18n/pt.po create mode 100644 google_account/i18n/pt_BR.po create mode 100644 google_account/i18n/ro.po create mode 100644 google_account/i18n/ru.po create mode 100644 google_account/i18n/sk.po create mode 100644 google_account/i18n/sl.po create mode 100644 google_account/i18n/sq.po create mode 100644 google_account/i18n/sr.po create mode 100644 google_account/i18n/sr@latin.po create mode 100644 google_account/i18n/sv.po create mode 100644 google_account/i18n/ta.po create mode 100644 google_account/i18n/th.po create mode 100644 google_account/i18n/tr.po create mode 100644 google_account/i18n/uk.po create mode 100644 google_account/i18n/vi.po create mode 100644 google_account/i18n/zh_CN.po create mode 100644 google_account/i18n/zh_TW.po create mode 100644 mail_tracking/README.rst create mode 100644 mail_tracking/__init__.py create mode 100644 mail_tracking/__init__.pyc create mode 100644 mail_tracking/__openerp__.py create mode 100644 mail_tracking/controllers/__init__.py create mode 100644 mail_tracking/controllers/__init__.pyc create mode 100644 mail_tracking/controllers/main.py create mode 100644 mail_tracking/controllers/main.pyc create mode 100644 mail_tracking/data/tracking_data.xml create mode 100644 mail_tracking/hooks.py create mode 100644 mail_tracking/hooks.pyc create mode 100644 mail_tracking/i18n/am.po create mode 100644 mail_tracking/i18n/ca.po create mode 100644 mail_tracking/i18n/de.po create mode 100644 mail_tracking/i18n/el_GR.po create mode 100644 mail_tracking/i18n/es.po create mode 100644 mail_tracking/i18n/es_ES.po create mode 100644 mail_tracking/i18n/fi.po create mode 100644 mail_tracking/i18n/fr.po create mode 100644 mail_tracking/i18n/gl.po create mode 100644 mail_tracking/i18n/it.po create mode 100644 mail_tracking/i18n/nl.po create mode 100644 mail_tracking/i18n/pt.po create mode 100644 mail_tracking/i18n/pt_BR.po create mode 100644 mail_tracking/i18n/pt_PT.po create mode 100644 mail_tracking/i18n/sl.po create mode 100644 mail_tracking/i18n/tr.po create mode 100644 mail_tracking/models/__init__.py create mode 100644 mail_tracking/models/__init__.pyc create mode 100644 mail_tracking/models/ir_mail_server.py create mode 100644 mail_tracking/models/ir_mail_server.pyc create mode 100644 mail_tracking/models/mail_mail.py create mode 100644 mail_tracking/models/mail_mail.pyc create mode 100644 mail_tracking/models/mail_message.py create mode 100644 mail_tracking/models/mail_message.pyc create mode 100644 mail_tracking/models/mail_tracking_email.py create mode 100644 mail_tracking/models/mail_tracking_email.pyc create mode 100644 mail_tracking/models/mail_tracking_event.py create mode 100644 mail_tracking/models/mail_tracking_event.pyc create mode 100644 mail_tracking/models/res_partner.py create mode 100644 mail_tracking/models/res_partner.pyc create mode 100644 mail_tracking/security/ir.model.access.csv create mode 100644 mail_tracking/static/description/icon.png create mode 100644 mail_tracking/static/src/css/mail_tracking.css create mode 100644 mail_tracking/static/src/img/delivered.png create mode 100644 mail_tracking/static/src/img/error.png create mode 100644 mail_tracking/static/src/img/opened.png create mode 100644 mail_tracking/static/src/img/sent.png create mode 100644 mail_tracking/static/src/img/unknown.png create mode 100644 mail_tracking/static/src/img/waiting.png create mode 100644 mail_tracking/static/src/js/mail_tracking.js create mode 100644 mail_tracking/static/src/xml/mail_tracking.xml create mode 100644 mail_tracking/tests/__init__.py create mode 100644 mail_tracking/tests/test_mail_tracking.py create mode 100644 mail_tracking/views/assets.xml create mode 100644 mail_tracking/views/mail_tracking_email_view.xml create mode 100644 mail_tracking/views/mail_tracking_event_view.xml create mode 100644 mail_tracking/views/res_partner_view.xml create mode 100644 mail_tracking_mailgun/README.rst create mode 100644 mail_tracking_mailgun/__init__.py create mode 100644 mail_tracking_mailgun/__init__.pyc create mode 100644 mail_tracking_mailgun/__openerp__.py create mode 100644 mail_tracking_mailgun/i18n/es.po create mode 100644 mail_tracking_mailgun/i18n/fr.po create mode 100644 mail_tracking_mailgun/i18n/sl.po create mode 100644 mail_tracking_mailgun/models/__init__.py create mode 100644 mail_tracking_mailgun/models/__init__.pyc create mode 100644 mail_tracking_mailgun/models/ir_mail_server.py create mode 100644 mail_tracking_mailgun/models/ir_mail_server.pyc create mode 100644 mail_tracking_mailgun/models/mail_tracking_email.py create mode 100644 mail_tracking_mailgun/models/mail_tracking_email.pyc create mode 100644 mail_tracking_mailgun/static/description/icon.png create mode 100644 mail_tracking_mailgun/static/description/icon.svg create mode 100644 mail_tracking_mailgun/tests/__init__.py create mode 100644 mail_tracking_mailgun/tests/test_mailgun.py create mode 100644 mail_tracking_mass_mailing/README.rst create mode 100644 mail_tracking_mass_mailing/__init__.py create mode 100644 mail_tracking_mass_mailing/__init__.pyc create mode 100644 mail_tracking_mass_mailing/__openerp__.py create mode 100644 mail_tracking_mass_mailing/hooks.py create mode 100644 mail_tracking_mass_mailing/hooks.pyc create mode 100644 mail_tracking_mass_mailing/i18n/ca.po create mode 100644 mail_tracking_mass_mailing/i18n/de.po create mode 100644 mail_tracking_mass_mailing/i18n/es.po create mode 100644 mail_tracking_mass_mailing/i18n/es_CO.po create mode 100644 mail_tracking_mass_mailing/i18n/fr.po create mode 100644 mail_tracking_mass_mailing/i18n/pt_BR.po create mode 100644 mail_tracking_mass_mailing/i18n/sl.po create mode 100644 mail_tracking_mass_mailing/models/__init__.py create mode 100644 mail_tracking_mass_mailing/models/__init__.pyc create mode 100644 mail_tracking_mass_mailing/models/mail_mail.py create mode 100644 mail_tracking_mass_mailing/models/mail_mail.pyc create mode 100644 mail_tracking_mass_mailing/models/mail_mail_statistics.py create mode 100644 mail_tracking_mass_mailing/models/mail_mail_statistics.pyc create mode 100644 mail_tracking_mass_mailing/models/mail_mass_mailing.py create mode 100644 mail_tracking_mass_mailing/models/mail_mass_mailing.pyc create mode 100644 mail_tracking_mass_mailing/models/mail_mass_mailing_contact.py create mode 100644 mail_tracking_mass_mailing/models/mail_mass_mailing_contact.pyc create mode 100644 mail_tracking_mass_mailing/models/mail_tracking_email.py create mode 100644 mail_tracking_mass_mailing/models/mail_tracking_email.pyc create mode 100644 mail_tracking_mass_mailing/models/mail_tracking_event.py create mode 100644 mail_tracking_mass_mailing/models/mail_tracking_event.pyc create mode 100644 mail_tracking_mass_mailing/static/description/icon.png create mode 100644 mail_tracking_mass_mailing/tests/__init__.py create mode 100644 mail_tracking_mass_mailing/tests/test_mass_mailing.py create mode 100644 mail_tracking_mass_mailing/views/mail_mail_statistics_view.xml create mode 100644 mail_tracking_mass_mailing/views/mail_mass_mailing_contact_view.xml create mode 100644 mail_tracking_mass_mailing/views/mail_mass_mailing_view.xml create mode 100644 mail_tracking_mass_mailing/views/mail_tracking_email_view.xml create mode 100644 smile_access_control/__init__.py create mode 100644 smile_access_control/__init__.pyc create mode 100644 smile_access_control/__openerp__.py create mode 100644 smile_access_control/data/res_users_data.xml create mode 100644 smile_access_control/i18n/fr.po create mode 100644 smile_access_control/models/__init__.py create mode 100644 smile_access_control/models/__init__.pyc create mode 100644 smile_access_control/models/res_groups.py create mode 100644 smile_access_control/models/res_groups.pyc create mode 100644 smile_access_control/models/res_users.py create mode 100644 smile_access_control/models/res_users.pyc create mode 100644 smile_access_control/static/description/icon.png create mode 100644 smile_access_control/tests/__init__.py create mode 100644 smile_access_control/tests/test_access_control.py create mode 100644 smile_access_control/tests/test_groups.py create mode 100644 smile_access_control/tests/test_users.py create mode 100644 smile_access_control/views/res_groups_view.xml create mode 100644 smile_access_control/views/res_users_view.xml create mode 100644 smile_event_event_calendar/__init__.py create mode 100644 smile_event_event_calendar/__init__.pyc create mode 100644 smile_event_event_calendar/__openerp__.py create mode 100644 smile_event_event_calendar/models/__init__.py create mode 100644 smile_event_event_calendar/models/__init__.pyc create mode 100644 smile_event_event_calendar/models/calendar_event.py create mode 100644 smile_event_event_calendar/models/calendar_event.pyc create mode 100644 smile_event_event_calendar/models/event.py create mode 100644 smile_event_event_calendar/models/event.pyc create mode 100644 smile_event_event_calendar/static/description/icon.png create mode 100644 smile_event_event_calendar/views/calendar_view.xml diff --git a/calendar_ics/__init__.py b/calendar_ics/__init__.py new file mode 100644 index 0000000..071a504 --- /dev/null +++ b/calendar_ics/__init__.py @@ -0,0 +1,2 @@ +import calendar +import res_partner diff --git a/calendar_ics/__init__.pyc b/calendar_ics/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b33230b5e014d2bb6bd6f056095f624c16f860d6 GIT binary patch literal 206 zcmYLDO9}!p3~hBI{!ZWlW}`iTBA&pF;9?L$nN%otn$nDj=XNcc4t_%N@?Hop89rv? z)BJgC)F%egcT&6%KuN8FQuU8(RqHZ5RAtk@B=$Y+Mxq-VTtu6@iHPhNlJMwqB~tx? z*CI{p&|AZ2AS7DeC|}TLV-YE`Ntw`m?Z7u|0DSZvz$)GQTbq{f8r)Wk7nf(I`VFt{ BF). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +{ + 'name': 'Calendar ics-urls', + 'version': '0.1', + 'category': 'Tools', + 'summary': 'Subscription on calendar.ics-urls', + 'licence': 'AGPL-3', + 'description': """ +Adds and updates calendar objects according to an ics-url + +""", + 'author': 'Vertel AB', + 'website': 'http://www.vertel.se', + 'depends': ['calendar',], + 'data': [ 'res_partner_view.xml', + #'security/ir.model.access.csv', + 'res_partner_data.xml' + ], + 'application': False, + 'installable': True, + 'demo': ['calendar_ics_demo.xml',], +} +# vim:expandtab:smartindent:tabstop=4s:softtabstop=4:shiftwidth=4: diff --git a/calendar_ics/calendar.py b/calendar_ics/calendar.py new file mode 100644 index 0000000..3970b1f --- /dev/null +++ b/calendar_ics/calendar.py @@ -0,0 +1,312 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution, third party addon +# Copyright (C) 2004-2016 Vertel AB (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +from openerp import models, fields, api, _ +from pytz import timezone +from openerp.exceptions import except_orm, Warning, RedirectWarning +from datetime import datetime, timedelta, time +from time import strptime, mktime, strftime +from openerp.tools import DEFAULT_SERVER_DATE_FORMAT, DEFAULT_SERVER_DATETIME_FORMAT +import re + +from openerp import http +from openerp.http import request + +import logging +_logger = logging.getLogger(__name__) + + +try: + from icalendar import Calendar, Event, vDatetime, FreeBusy +except ImportError: + raise Warning('icalendar library missing, pip install icalendar') + +try: + import urllib2 +except ImportError: + raise Warning('urllib2 library missing, pip install urllib2') + + +# calendar_ics -> res.partner + +# http://ical.oops.se/holidays/Sweden/-1,+1 +# http://www.skatteverketkalender.se/skvcal-manadsmoms-maxfyrtiomiljoner-ingenperiodisk-ingenrotrut-verk1.ics + +class calendar_event(models.Model): + _inherit = 'calendar.event' + + ics_subscription = fields.Boolean(default=False) # partner_ids + ics_subscription -> its ok to delete + + @api.multi + def set_ics_event(self, ics_file, partner): + for event in Calendar.from_ical(ics_file).walk('vevent'): + #~ if not event.get('uid'): + #~ event.add('uid',reduce(lambda x,y: x ^ y, map(ord, str(event.get('dtstart') and event.get('dtstart').dt or '' + event.get('summary') + event.get('dtend') and event.get('dtend').dt or ''))) % 1024) + + summary = '' + description = unicode(event.get('description', '')) + if unicode(event.get('summary')) and len(unicode(event.get('summary'))) < 35: + summary = unicode(event.get('summary')) + elif len(unicode(event.get('summary'))) >= 35: + summary = unicode(event.get('summary'))[:35] + if not event.get('description'): + description = unicode(event.get('summary')) + + record = {r[1]:r[2] for r in [ ('dtstart','start_date',event.get('dtstart') and event.get('dtstart').dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT)), + ('dtend','stop_date',event.get('dtend') and event.get('dtend').dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT)), + #~ ('dtstamp','start_datetime',event.get('dtstamp') and event.get('dtstamp').dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT)), + #~ ('description','description',description), + ('duration','duration',event.get('duration')), + ('location','location',event.get('location') and unicode(event.get('location')) or partner.ics_location), + ('class','class',event.get('class') and str(event.get('class')) or partner.ics_class), + ('summary','name',summary), + ('rrule', 'rrule',event.get('rrule') and event.get('rrule').to_ical() or None), + ] if event.get(r[0])} + + partner_ids = self.env['res.partner'].get_attendee_ids(event) + #~ raise Warning(partner_ids) + if partner_ids: + partner_ids.append(partner.id) + else: + partner_ids = [partner.id] + + record['partner_ids'] = [(6,0,[partner_ids])] + #~ record['partner_ids'] = [(6,0,self.env['res.partner'].get_attendee_ids(event)[0] and self.env['res.partner'].get_attendee_ids(event)[0].append(partner.id) or [partner.id])] + #~ raise Warning(record['partner_ids']) + #~ record['attendee_ids'] = [(6,0,[attendee])] + record['ics_subscription'] = True + record['start'] = record.get('start_date') + record['stop'] = record.get('stop_date') or record.get('start') + record['description'] = description + record['show_as'] = partner.ics_show_as + record['allday'] = partner.ics_allday + #~ record['rrule'] = event.get('rrule').to_ical() + #~ raise Warning(record['rrule_type'].to_ical) + + tmpStart = datetime.time(datetime.fromtimestamp(mktime(strptime(record['start'], DEFAULT_SERVER_DATETIME_FORMAT)))) + tmpStop = datetime.fromtimestamp(mktime(strptime(record['stop'], DEFAULT_SERVER_DATETIME_FORMAT))) + + if tmpStart == time(0,0,0) and tmpStart == datetime.time(tmpStop): + record['allday'] = True + + if not record.get('stop_date'): + record['allday'] = True + record['stop_date'] = record['start_date'] + elif record.get('stop_date') and record['allday']: + record['stop_date'] = vDatetime(tmpStop - timedelta(hours=24)).dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT) + record['stop'] = record['stop_date'] + _logger.error('ICS %s' % record) + self.env['calendar.event'].create(record) + #~ event_id = self.env['calendar.event'].create(record) +#~ + #~ attendee_values = self.env['res.partner'].get_attendee_ids(event) + #~ for i in range(len(attendee_values[0])): + #~ self.env['calendar.attendee'].create({ + #~ 'event_id': event_id.id, + #~ 'partner_id': attendee_values[0][i], + #~ 'email': attendee_values[1][i], + #~ }) + + #~ 'state': fields.selection(STATE_SELECTION, 'Status', readonly=True, help="Status of the attendee's participation"), + #~ 'cn': fields.function(_compute_data, string='Common name', type="char", multi='cn', store=True), + #~ 'partner_id': fields.many2one('res.partner', 'Contact', readonly="True"), + #~ 'email': fields.char('Email', help="Email of Invited Person"), + #~ 'availability': fields.selection([('free', 'Free'), ('busy', 'Busy')], 'Free/Busy', readonly="True"), + #~ 'access_token': fields.char('Invitation Token'), + #~ 'event_id': fields.many2one('calendar.event', 'Meeting linked', ondelete='cascade'), + + @api.multi + def get_ics_event(self): + event = self[0] + ics = Event() + ics = self.env['calendar.attendee'].get_ics_file(event) + calendar = Calendar() + date_format = DEFAULT_SERVER_DATETIME_FORMAT + + + #~ for t in ics_record: + #~ ics[t[2]] = eval(t[3]) + #~ + #~ foo = {ics[t[2]]: event.read([t[1]]) for t in ics_record} + #~ + #~ + #~ ics['uid'] = event.id + #~ ics['allday'] = event.allday + #~ + #~ if ics['allday']: + #~ date_format = DEFAULT_SERVER_DATE_FORMAT + #~ + #~ ics['dtstart'] = vDatetime(datetime.fromtimestamp(mktime(strptime(event.start_date, date_format)))) + #~ ics['dtend'] = vDatetime(datetime.fromtimestamp(mktime(strptime(event.stop_date, date_format)))) + #~ ics['summary'] = event.name + #~ ics['description'] = event.description + #~ ics['class'] = event.read(['class']) + + #~ calendar.add_component(ics) + #~ raise Warning(calendar.to_ical()) + return ics + + + @api.multi + def get_ics_file(self, events_exported, partner): + """ + Returns iCalendar file for the event invitation. + @param event: event object (browse record) + @return: .ics file content + """ + ics = Event() + event = self[0] + + #~ raise Warning(self.env.cr.dbname) + #~ The method below needs som proper rewriting to avoid overusing libraries. + def ics_datetime(idate, allday=False): + if idate: + if allday: + return str(vDatetime(datetime.fromtimestamp(mktime(strptime(idate, DEFAULT_SERVER_DATETIME_FORMAT)))).to_ical())[:8] + else: + return vDatetime(datetime.fromtimestamp(mktime(strptime(idate, DEFAULT_SERVER_DATETIME_FORMAT)))).to_ical() + 'Z' + return False + + #~ try: + #~ # FIXME: why isn't this in CalDAV? + #~ import vobject + #~ except ImportError: + #~ return res + + #~ cal = vobject.iCalendar() + + #~ event = cal.add('vevent') + if not event.start or not event.stop: + raise osv.except_osv(_('Warning!'), _("First you have to specify the date of the invitation.")) + ics['summary'] = event.name + if event.description: + ics['description'] = event.description + if event.location: + ics['location'] = event.location + if event.rrule: + ics['rrule'] = event.rrule + #~ ics.add('rrule', str(event.rrule), encode=0) + #~ raise Warning(ics['rrule']) + + if event.alarm_ids: + for alarm in event.alarm_ids: + valarm = ics.add('valarm') + interval = alarm.interval + duration = alarm.duration + trigger = valarm.add('TRIGGER') + trigger.params['related'] = ["START"] + if interval == 'days': + delta = timedelta(days=duration) + elif interval == 'hours': + delta = timedelta(hours=duration) + elif interval == 'minutes': + delta = timedelta(minutes=duration) + trigger.value = delta + valarm.add('DESCRIPTION').value = alarm.name or 'Odoo' + if event.attendee_ids: + for attendee in event.attendee_ids: + attendee_add = ics.get('attendee') + attendee_add = attendee.cn and ('CN=' + attendee.cn) or '' + if attendee.cn and attendee.email: + attendee_add += ':' + attendee_add += attendee.email and ('MAILTO:' + attendee.email) or '' + + ics.add('attendee', attendee_add, encode=0) + + if events_exported: + event_not_found = True + + for event_comparison in events_exported: + #~ raise Warning('event_comparison = %s ics = %s' % (event_comparison, ics)) + if str(ics) == event_comparison: + event_not_found = False + break + + if event_not_found: + events_exported.append(str(ics)) + + ics['uid'] = '%s@%s-%s' % (event.id, self.env.cr.dbname, partner.id) + ics['created'] = ics_datetime(strftime(DEFAULT_SERVER_DATETIME_FORMAT)) + tmpStart = ics_datetime(event.start, event.allday) + tmpEnd = ics_datetime(event.stop, event.allday) + + if event.allday: + ics['dtstart;value=date'] = tmpStart + else: + ics['dtstart'] = tmpStart + + if tmpStart != tmpEnd or not event.allday: + if event.allday: + ics['dtend;value=date'] = str(vDatetime(datetime.fromtimestamp(mktime(strptime(event.stop, DEFAULT_SERVER_DATETIME_FORMAT))) + timedelta(hours=24)).to_ical())[:8] + else: + ics['dtend'] = tmpEnd + + return [ics, events_exported] + + else: + events_exported.append(str(ics)) + + ics['uid'] = '%s@%s-%s' % (event.id, self.env.cr.dbname, partner.id) + ics['created'] = ics_datetime(strftime(DEFAULT_SERVER_DATETIME_FORMAT)) + tmpStart = ics_datetime(event.start, event.allday) + tmpEnd = ics_datetime(event.stop, event.allday) + + if event.allday: + ics['dtstart;value=date'] = tmpStart + else: + ics['dtstart'] = tmpStart + + if tmpStart != tmpEnd or not event.allday: + if event.allday: + ics['dtend;value=date'] = str(vDatetime(datetime.fromtimestamp(mktime(strptime(event.stop, DEFAULT_SERVER_DATETIME_FORMAT))) + timedelta(hours=24)).to_ical())[:8] + else: + ics['dtend'] = tmpEnd + + return [ics, events_exported] + + @api.multi + def get_ics_freebusy(self): + """ + Returns iCalendar file for the event invitation. + @param event: event object (browse record) + @return: .ics file content + """ + #~ ics = FreeBusy() + event = self[0] + + def ics_datetime(idate, iallday=False): + if idate: + return vDatetime(idate).to_ical() + return False + + if not event.start or not event.stop: + raise osv.except_osv(_('Warning!'), _("First you have to specify the date of the invitation.")) + + allday = event.allday + event_start = datetime.fromtimestamp(mktime(strptime(event.start, DEFAULT_SERVER_DATETIME_FORMAT))) + event_stop = datetime.fromtimestamp(mktime(strptime(event.stop, DEFAULT_SERVER_DATETIME_FORMAT))) + + if allday: + event_stop += timedelta(hours=23, minutes=59, seconds=59) + + return '%s/%s' % (ics_datetime(event_start, allday), ics_datetime(event_stop, allday)) + +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/calendar_ics/calendar.pyc b/calendar_ics/calendar.pyc new file mode 100644 index 0000000000000000000000000000000000000000..926898dd89cd025da0b9b0b9bcff585938f44f09 GIT binary patch literal 7876 zcmdT}O>7*;m44Md9CC)kfALQerIBnZW5=e9{6nD(%MxV}wrHbC|6~wjFq&>kJ(`{w zcJKR^To zAvwjWdatTpz4z+9uWJ1NnJRyG`Va55WcV|N|F7X=4~P6S~r86$cgw!V_DM`H~Nm=S;M=MBYQj$rjqpV21BFU80ryOle zI#ZHNOMP0B8L7`mGAs32M=MHaPLg@4&r7l(^##{EE}e5yKc{j|sGN&ZUv#vRbe1Gp zmiqFDcSY(e60JykRig9q1bez5N7r<8SvnUbS(EyjB$uRqNs`M_zbr{r>QyoCch{s4 zU6Ds+Noxi_QAxr{&hULBT_YbH&FUueDpT^aRxIz9#+_SxTaCMK2lsC6WtW~# z-rK&Hv+TGHa{Y%{)^{!LCXEgTk}C+ddHG@~PL9Y)o<_muOV zLf$i(_l)H|6$y50G?qOp)rLx?{t-s|%|Rz?Q8HTp96qeu0<{154}K=nHgaqzL))W- zsNDJRxBd?`6rA`1*Zd4jklv@bPw;2tq;RIcz#jai|0uB2DSzG%QaC1$U|ukcX3MEq zq8t9nfn$>X{wV`7XBC4-!eJTvG(O0B@O$Zs{6O@87UfgyZCt{MeC#--@72t3Ds8rl z(jMm_1Zf{TM~Eor{3Yf8Am`WS7x^a{Qic<1Y~dso{tY`dfTTY$ry9{7EZ6_3IrgMo z(sic<(PcPfO11o-27%yg4~P7>4w=*;Fx9ji`&yroa3*J-(cu+uI98i&EGp8U@!+SB z@WHs;!E`5MatxbKOE@d5ZJmI ze>x?UgvGOq(q5DB0_R@B7&ElxMcDEZJK1-zD(}PQyR|h$gB?vphc0ZOE!iZBFtV*Q zMndRyHI~>xk|3bQ&w>s2})gBw2UduH&qSa|ys|mQaMm5J;$1Ej&5HR3K3B}DnK2i3!s`s*)@@CMU!?+hv&KZps^i5jkHa>O} z1wsYG0b&JE$P38Cl zP01|bQ(RU6#}i0`YVcp-U_-t6BUJ*Hsro)~IlMqjSFv9eq|UZ4m2{6PYy+ef3Fi=% zS#e0r)7uZM0)}zI2jDBFT%gqSW9>ykL~qe0I1oyb{zwTWC5(>1Qd3SeUZBSle2%LErw!t9I6w47jaKxHs!GCe61R}oT_1;7MwY7Xb_4X;E-cl?w34_CJR@Bnt-t|YFVMYXUxIB;J%B& zNWh=^Kr<)P^7utI?|gVwPG%%q=0FH{?DTNcg9m}>or9Ym{@y>Hmh`6u@V9}ca$c|- zz!Z8102Ywqd1+se_C({%ub+KfKD{w z%%e_dUhC=qddFbE;0y32c$I5h#7wBo$s=Fvitl(U>Cv#3c6>;jRVBM3?W>YKC)xAE zB`8pi2I(_Ex@+{AWysiGXS6{jyd+hwd093OFeijTqw1U)QW|-HK-4{N{?^J_Ec{vJ ze7%q>=bwkQ^oNCKrX0-qbmfFs5UH;sV%Z;~C|8F+L6i;BuC2zm^Se58V-=ybnmvrF z8U=AvKaBB60r0so8u%JgXESjOH->z@`)#~=RBQLs-bXg7x-|O2>5x2#CAh`n6q@Mc&$rO0sP1mFV}~y_%z-gs zYOsOYGfY}so0&9!S^5RqilD_5@%t6;y0MgW_!M=;ejSawacZ;bQEyOv*gTA?S+8pQ zQ7hg*Qmb>SYHwfbXKa6pl7e;25pWZVmkyhq=I{}0FW7$Ljjcd;zq@xU*i)F5MjcG) zU?32$4X$%2&6~vCK?Zz-%weiE|IV9c-_9XZeLz^FM5MG)CC$__-%Sdl*pm;7crsGtX#{5LFeZ*qLm& zB;8k=u_uXXeCJO~* z%IRQpc%QeR(@TPS>mPS_dU}nj47O0{)2D_EVA#ifAn_;+-XQfJ3%$DRk&mM5mVjv8#&N~Tk z{8l%7c4sem3zPl~ANv^!884Y~p)z+4D18b@aW?-HSf4?wgmM;$eSY*Q0j)dgMf6UY zs<#F#U-YKDd7Rw|#r4;KI~UEOR|1wVd&Hn`f~ByYK%OFe zzI6gxD6YqwW5p^AAwW&vqyytY2sR2GEJfuDuoS_ysCNK;IK_1lzRt{xkc{`WJel)h z@(T>OKb&Pi*!Cs;H^L2=7a$ji*1ZPujSmkx;(rtGUx>#*oVaQrabf@#U|k2JzVFG> zZjJZCzoX2?6Q`Mtv4EKk4`o_m;sQJa71?c9UsrbYS;n0~p0|MUMqgqAPN7jPcK7FJ z=-ND|UxFv;a|Bb#>@!Ov4F2&lilELKUyF1T7T4}>Xf30|y1l+`Yx-94`S2Rt=fD;V zhDsNoCRlq~Cgu^)M|q7;rx8epX|8e6!adaJmpc3wp~2^xXQ#~3D~aBC@fFE^d_}TG z<(`9lGEw#_V~83!;a5-=ac|e1YYu2M7?2wcO(%^8zOKUC6q?*}Bkn%L!&DaV#H$Kl z@AW!Sv#Tx=yola_o~H3O!FLaF@Fx4-VZqoHe2n6BpIZBCUowIv%t?%)7iR{ud2fDa zzB)gst)o}P?BQ)FO8c~|sPHPL8dQ-$|0w%7ASA$Rt;mpj!+qZd6lw#yNWd5uFk`r9 zBidTuj@%;=^M&RyeOk%q$eH1-;bt2oXV^>@isyje5rRm_a + + + + + + + Demo meeting about meat + Meeting to discuss project plan and hash out the details of implementation. + + + + + + open + + + + + + + Demo Kickoff + Weekend at burneys + + + + + + open + + + + + + + Demo Bring the meat. + All you can eat buffe. + + + + + + open + + + + + + + Demo Trash the meat grinder + Bring your own hammers and tools + BurgerTown, 31 butcherstreet + + + + + + open + + + + + + + Demo Trash the meat grinder reunion! + Bring your own hammers and tools AND meat this time + BurgerTown, 31 butcherstreet + + + + + + open + + + diff --git a/calendar_ics/calendar_view.xml b/calendar_ics/calendar_view.xml new file mode 100644 index 0000000..b8eaa0b --- /dev/null +++ b/calendar_ics/calendar_view.xml @@ -0,0 +1,108 @@ + + + + + + + + + Calendar - ics url + calendar.ics + +
+ +
+
+
+

+ +

+

+ + + +

+
+
+
+ + +
+
+
+
+ + + + + + Calendar ics-url + calendar.ics + + + + + + +