Compare commits

..

391 Commits
2.7.1 ... 3.0.0

Author SHA1 Message Date
yuri
ffb94b960d fix entity manager 2015-02-13 16:24:31 +02:00
yuri
f73ac0779b restoreDate and afterSave 2015-02-13 12:30:36 +02:00
yuri
8003af682e email account create fix 2015-02-12 18:32:37 +02:00
yuri
cbf7bf18f2 fix preferences saving 2015-02-12 17:54:22 +02:00
yuri
ceaa0a8322 refresh email list view after send 2015-02-12 16:49:53 +02:00
yuri
8ca410d994 fix calendar 2015-02-12 16:44:12 +02:00
yuri
5fc7f2509d fix app.js 2015-02-12 16:08:15 +02:00
yuri
f2e1ba3780 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-02-11 15:53:49 +02:00
yuri
93ac871640 change year 2015-02-11 15:53:39 +02:00
Taras Machyshyn
187a8a02a1 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-02-11 12:44:18 +02:00
Taras Machyshyn
bcf5686eec fixed getModuleList() 2015-02-11 12:44:05 +02:00
yuri
027507b61e display task in top bar in calendar 2015-02-11 11:59:15 +02:00
yuri
49b3d17952 change default filters 2015-02-11 11:27:00 +02:00
yuri
e0958cfeec improve notifications 2015-02-11 11:00:43 +02:00
Taras Machyshyn
00e12b50b7 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-02-10 15:02:17 +02:00
Taras Machyshyn
44b8b00106 fixed calendar issue in IE 2015-02-10 15:02:02 +02:00
yuri
e0855e3092 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-02-10 13:24:10 +02:00
yuri
cb0d70430a ability to remove stream records for admin 2015-02-10 13:22:58 +02:00
Taras Machyshyn
042575ce6b improved 'fieldManager' 2015-02-10 12:46:19 +02:00
yuri
5cd18b57d2 industry list update 2015-02-10 12:25:14 +02:00
yuri
d1e46e3d9a fix field manager 2015-02-10 11:56:13 +02:00
yuri
1a3348f2c2 change user entityDefs links 2015-02-10 11:41:58 +02:00
yuri
75edc5c165 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-02-10 11:30:17 +02:00
yuri
60184ebbbe ability to disable fields and link for layout manager 2015-02-10 11:30:05 +02:00
yuri
ddb6cb7483 Clear link-multiple field input if not selected 2015-02-10 10:32:45 +02:00
Taras Machyshyn
2ddd44a2fe Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-02-09 17:11:08 +02:00
Taras Machyshyn
ce55866445 added check 'php' version for extension/upgrade packages 2015-02-09 17:10:46 +02:00
Taras Machyshyn
2bc7f85a58 added getPhpVersion() 2015-02-09 17:07:06 +02:00
yuri
a27df2c41f Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-02-09 13:01:36 +02:00
yuri
170581dd28 fetched values for linkMultiple fields 2015-02-09 13:01:18 +02:00
Taras Machyshyn
00b0c904ae fixed warnings 2015-02-09 12:14:27 +02:00
yuri
fdab17265f change version 2015-02-09 12:12:27 +02:00
Taras Machyshyn
96d0a7db00 bug fixes 2015-02-09 11:32:39 +02:00
Taras Machyshyn
2835928ac0 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-02-06 17:37:32 +02:00
Taras Machyshyn
4c22b42b99 fixed cache bug for Extensions 2015-02-06 17:37:11 +02:00
yuri
64ddaa40a8 add reminder time 2015-02-06 16:17:04 +02:00
yuri
bc7006e193 open url field in new pahe 2015-02-06 15:51:45 +02:00
yuri
1ae0a9df28 inline download: add types 2015-02-06 15:05:56 +02:00
yuri
a4f9280eba cleanup 2015-02-06 13:23:36 +02:00
yuri
2528fc34c8 Enable User tab 2015-02-06 13:16:41 +02:00
yuri
979f07bf9b Merge improvements 2 2015-02-06 12:19:13 +02:00
yuri
52bff4de1c fix service factory 2015-02-06 12:16:31 +02:00
Taras Machyshyn
4c017361f8 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-02-06 11:38:41 +02:00
Taras Machyshyn
84aa1339d9 fixed a bug with php reserved names for classes 2015-02-06 11:38:26 +02:00
yuri
987cd4a121 Import Email: fix issue with text and html attachments 2015-02-06 11:38:20 +02:00
yuri
e50ad5106f Load user data each time app starts 2015-02-06 10:47:34 +02:00
yuri
071cbcb0fb cleanup 2015-02-06 10:47:18 +02:00
yuri
43f1cb9af9 Field Manager:Reload metadata when field is saved 2015-02-06 10:46:50 +02:00
yuri
220c55e9b4 fix entity manager 2015-02-06 10:02:14 +02:00
yuri
927610efb0 clearnup 2015-02-06 09:55:30 +02:00
yuri
78fcaf1fa3 update handlebars 2015-02-06 09:39:55 +02:00
yuri
3bd9af031d cleanup 2015-02-05 19:05:06 +02:00
yuri
16ee3d68e8 merge changes 1 2015-02-05 18:13:08 +02:00
yuri
d49ee3c187 fix select and create 2015-02-05 16:31:39 +02:00
Taras Machyshyn
2e544f1ccf Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-02-05 15:05:08 +02:00
Taras Machyshyn
1c51125e66 changed 'acceptedVersions' identifier to semantic versioner 2015-02-05 15:04:51 +02:00
yuri
1ed47f5d0d fix navbar update width 2015-02-05 13:35:47 +02:00
yuri
133fa0cb36 note order 2015-02-05 12:53:44 +02:00
yuri
295904bf4c change admin tpl 2015-02-05 11:59:32 +02:00
yuri
951230f7e1 change admin tpl 2015-02-05 11:57:24 +02:00
yuri
ee58886206 fix imap encoding issue 2015-02-05 11:56:52 +02:00
yuri
41575f6f13 add industry 2015-02-05 11:22:36 +02:00
yuri
18ae33d417 send password only to active users 2015-02-05 11:16:22 +02:00
yuri
36daf5a762 iframe 2015-02-05 11:01:55 +02:00
yuri
8a41a2cd05 change calls/meetings dashlet order 2015-02-05 10:24:01 +02:00
yuri
61497d2a01 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-02-04 17:07:00 +02:00
yuri
a3045a88f3 Inbound Email improve 2015-02-04 17:06:50 +02:00
Taras Machyshyn
fd072520a9 fixed tests 2015-02-04 17:01:01 +02:00
yuri
6ef9d8428f improve js actions 2015-02-03 16:15:39 +02:00
yuri
33a7176165 blockquote 2015-02-03 15:53:52 +02:00
yuri
044de7d744 stream info 2015-02-03 13:15:14 +02:00
yuri
801ba05cd8 afterDelete beforeDelete 2015-02-03 12:45:54 +02:00
yuri
0dc5a4e4f3 after/before Create/Update in Record service 2015-02-03 12:43:56 +02:00
yuri
230ed63e67 getEntityBeforeUpdate 2015-02-03 12:38:10 +02:00
yuri
7316866a1a Merge branch 'hotfix/2.9.3' 2015-02-03 12:36:44 +02:00
yuri
c7be54d9c9 fix textcomplete 2 2015-02-03 12:36:26 +02:00
yuri
dcc118ec5d Merge branch 'hotfix/2.9.3' 2015-02-03 12:18:14 +02:00
yuri
84e98054b7 fix textcomplete 2015-02-03 12:17:39 +02:00
yuri
f37308f5a5 lead source changes 2015-02-03 11:58:54 +02:00
yuri
9688b3be3c clearnup 2015-02-02 18:09:41 +02:00
yuri
6490a1ca97 cleanup 2015-02-02 17:19:55 +02:00
yuri
c15fc89f52 refresh panel 2015-02-02 15:35:35 +02:00
yuri
9207030ccb row actions change to avoid user removing 2015-02-02 15:00:27 +02:00
yuri
018eb44de6 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-02-02 12:49:46 +02:00
yuri
bc92b96a6b user isActive 2 2015-02-02 12:49:37 +02:00
yuri
ee57c9223c User:isActive 2015-02-02 12:22:37 +02:00
Taras Machyshyn
f799ffc61f Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-02-02 12:10:21 +02:00
Taras Machyshyn
bdb1f2f3b6 improved Util::merge() functionality 2015-02-02 12:10:04 +02:00
yuri
fd755df67b Merge branch 'hotfix/2.9.3' 2015-02-02 11:21:14 +02:00
yuri
e9edd01d08 modified date and id for remove 2015-02-02 11:21:00 +02:00
yuri
dea7e0b33e modified date and id for remove 2015-02-02 11:20:28 +02:00
yuri
25b50baa1a showPanel/hidePanel 2015-01-30 16:09:43 +02:00
yuri
8a53657b9c text search by email address 2015-01-30 15:51:47 +02:00
yuri
c6ecbf4942 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-01-30 14:55:51 +02:00
yuri
56d11807a1 access check in select managers change 2015-01-30 14:52:34 +02:00
yuri
cf3b4b284a record.base 2015-01-30 14:47:14 +02:00
yuri
953a59cb57 no create for users and teams in subpanels 2015-01-30 13:13:38 +02:00
yuri
f60061a387 Merge branch 'hotfix/2.9.3' 2015-01-30 12:54:00 +02:00
yuri
c627d84273 cleanup 2015-01-30 12:53:52 +02:00
Taras Machyshyn
5a16ee0493 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-01-29 17:11:28 +02:00
Taras Machyshyn
14252d6e9e FileManager: improved 'remove()' functionality 2015-01-29 17:11:16 +02:00
yuri
c0de3e1c4e Merge branch 'stable' 2015-01-29 13:00:11 +02:00
yuri
e0c3530ae5 change version 2015-01-29 12:34:13 +02:00
yuri
8b4070f9ae Merge branch 'hotfix/2.9.2' 2015-01-29 12:14:13 +02:00
yuri
0b6c5c2862 Merge branch 'hotfix/2.9.2' of ssh://172.20.0.1/var/git/espo/backend into hotfix/2.9.2 2015-01-29 12:13:54 +02:00
yuri
ce9ff10cb0 fix imap 2015-01-29 12:03:43 +02:00
Taras Machyshyn
de688bfa12 CronManager minor changes 2015-01-29 11:44:47 +02:00
yuri
f4ef5fc36f add tentative event status 2015-01-28 17:04:45 +02:00
yuri
b1e184c6d1 link manager dev 2015-01-28 16:38:27 +02:00
yuri
fbf665fd76 Merge branch 'hotfix/2.9.2' 2015-01-28 10:39:14 +02:00
yuri
95fd66a7a6 Entity::isSaved 2015-01-28 10:38:57 +02:00
yuri
4b98ea79e0 change link manager edit modal 2015-01-28 10:19:17 +02:00
yuri
2e916a2ba8 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-01-27 17:31:13 +02:00
yuri
26a4d1c6ff link manager dev 2015-01-27 17:31:00 +02:00
Taras Machyshyn
33fef4c90e Merge branch 'hotfix/2.9.2' 2015-01-27 17:19:18 +02:00
yuri
2dc15294fc Merge branch 'hotfix/2.9.2' 2015-01-27 16:30:26 +02:00
yuri
171df33736 move logic to Repository::afterSave 2015-01-27 16:27:05 +02:00
yuri
9b846b45bc link manager dev 2015-01-27 16:21:22 +02:00
yuri
bc65975f74 fix in default config 2015-01-27 11:53:55 +02:00
yuri
a5308831f2 Merge branch 'hotfix/2.9.2' 2015-01-27 11:42:17 +02:00
yuri
ef05e4e9f4 add cryptKey to systemItems 2015-01-27 11:40:51 +02:00
yuri
83f0a81eb7 add global Search Entity List param 2015-01-27 11:21:06 +02:00
yuri
9e28d4a261 change meetings and calls dashlets layouts 2015-01-27 10:30:48 +02:00
yuri
a9b3320302 Merge branch 'hotfix/2.9.2' 2015-01-26 17:36:21 +02:00
yuri
b67580ee1d Merge branch 'hotfix/2.9.2' of ssh://172.20.0.1/var/git/espo/backend into hotfix/2.9.2 2015-01-26 17:36:06 +02:00
yuri
884ccb5265 Select Managers changes and Email changes 2015-01-26 17:35:43 +02:00
Taras Machyshyn
ac56c3f79e added 'Cleanup' job 2015-01-26 15:24:10 +02:00
Taras Machyshyn
e218056683 Cron job improvements 2015-01-26 12:28:00 +02:00
yuri
838288a463 Merge branch 'hotfix/2.9.2' 2015-01-26 12:11:30 +02:00
yuri
e74b90d048 fix email notFound 2015-01-26 11:12:25 +02:00
yuri
b2a653a3dc fix App controller 2015-01-26 11:09:54 +02:00
yuri
48ee7d4cc7 Merge branch 'hotfix/2.9.2' of ssh://172.20.0.1/var/git/espo/backend into hotfix/2.9.2 2015-01-23 18:19:25 +02:00
yuri
1d38f80748 improve email accounts 2015-01-23 18:19:02 +02:00
Taras Machyshyn
c712366737 cron jobs improvements and fixes 2015-01-23 17:44:59 +02:00
yuri
71f40fd440 checlemailaccounts job 2015-01-23 17:12:12 +02:00
yuri
9049ebfa8c fix email importer 2015-01-23 17:05:33 +02:00
yuri
f4b9356173 em dev 2015-01-22 15:55:11 +02:00
yuri
beaa4a29ba Merge branch 'hotfix/2.9.1' 2015-01-22 15:32:36 +02:00
yuri
632ee66155 Merge branch 'hotfix/2.9.1' of ssh://172.20.0.1/var/git/espo/backend into hotfix/2.9.1 2015-01-22 15:14:25 +02:00
yuri
4446bc3167 fix oauth client 2015-01-22 15:14:16 +02:00
Taras Machyshyn
785934c7cc Language: chnaged set(), delete() methods 2015-01-22 14:49:40 +02:00
Taras Machyshyn
ac36096d55 Merge branch 'hotfix/2.9.1' of ssh://172.20.0.1/var/git/espo/backend into hotfix/2.9.1 2015-01-22 13:15:15 +02:00
Taras Machyshyn
8ec8cb3c56 Metadata: fixed description 2015-01-22 13:14:55 +02:00
Taras Machyshyn
1f7cb2402d changed Metadata methods set(), get(), added save() 2015-01-22 13:14:06 +02:00
yuri
987ba2faa5 EM dev 2015-01-22 12:10:53 +02:00
yuri
a24f697dca Merge branch 'hotfix/2.9.1' 2015-01-22 11:41:42 +02:00
yuri
3825893ec1 integrations changes 2015-01-22 11:28:17 +02:00
yuri
a4ed78b953 change version 2015-01-21 17:22:08 +02:00
yuri
c7947d0c46 Merge branch 'hotfix/2.9.1' 2015-01-21 17:13:48 +02:00
yuri
eed9059913 integration changes 2015-01-21 17:11:12 +02:00
yuri
20a1053413 fix select manager 2015-01-21 15:50:41 +02:00
yuri
16aca57f17 em deb 2015-01-21 15:30:02 +02:00
yuri
a225748840 make documents customizable 2015-01-21 15:19:06 +02:00
yuri
fff1be9d07 entity manager dev 2015-01-21 15:13:37 +02:00
yuri
b73ca3f1bc change accountInfo messages 2015-01-20 18:14:48 +02:00
yuri
93a4f999b6 entity manager 2 2015-01-20 18:01:05 +02:00
yuri
3030643ce4 entity manager 1 2015-01-20 16:40:04 +02:00
Taras Machyshyn
e814ea9ec6 added 'save()' method to Layout 2015-01-20 15:34:29 +02:00
Taras Machyshyn
de16e9a9ce added '2015' to 'About' page 2015-01-20 12:36:52 +02:00
Taras Machyshyn
62fba991e2 fixed pt_BR translation syntax errors 2015-01-20 12:31:46 +02:00
Taras Machyshyn
832c63e014 added 'getPhpContents()' to FileManager 2015-01-20 12:22:04 +02:00
yuri
46913c3574 cleanup 2015-01-20 10:55:04 +02:00
yuri
0194d364b8 change opportunity list small layout 2015-01-19 15:09:30 +02:00
yuri
1c7785f6ba fix salutation list 2015-01-19 10:41:45 +02:00
yuri
1049ec56eb change version 2015-01-16 17:04:31 +02:00
yuri
734936b605 fix moment 2015-01-16 13:21:18 +02:00
yuri
67e1a088ff Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-01-16 11:06:31 +02:00
yuri
af623631d1 change gitignore 2015-01-16 11:06:16 +02:00
Taras Machyshyn
8035bc424e added 2015 to the license 2015-01-15 15:36:20 +02:00
Taras Machyshyn
7e99cd94b3 changed link title 2015-01-15 12:22:47 +02:00
Taras Machyshyn
a88218aceb added 'desabled' option for popupNotifications 2015-01-15 12:04:28 +02:00
yuri
e5fd4dac4d update fullcalendar and moment 2015-01-15 10:59:06 +02:00
yuri
26d407bd68 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-01-15 10:31:25 +02:00
yuri
80ad96cce6 Merge branch 'hotfix/2.8.2' 2015-01-15 10:31:09 +02:00
yuri
1d85ac3428 fix customLabel 2015-01-14 15:34:37 +02:00
yuri
ca5dfd851d customLabels for list 2015-01-14 15:12:37 +02:00
Taras Machyshyn
8c76b88b8d improved notifications 2015-01-14 15:02:45 +02:00
yuri
ff5616c399 fix field manager 2015-01-14 14:36:09 +02:00
yuri
2027b5aca9 method name change in app.js 2015-01-14 10:58:04 +02:00
yuri
a43e401ce7 fix nl_NL 2015-01-14 09:42:04 +02:00
yuri
396e2c176c fix lang 2015-01-14 09:41:18 +02:00
Taras Machyshyn
4ab40990f5 fixed a test 2015-01-13 16:23:40 +02:00
Taras Machyshyn
35e325d8d0 improving metadata caching 2015-01-13 16:17:59 +02:00
Taras Machyshyn
b947d667d6 added 'module.json' - options for modules 2015-01-13 13:48:01 +02:00
yuri
b4ab83d2d8 Merge branch 'hotfix/2.8.2' of ssh://172.20.0.1/var/git/espo/backend into hotfix/2.8.2 2015-01-13 10:43:19 +02:00
yuri
74adfb8b3e update nl_NL 2015-01-13 10:43:01 +02:00
Taras Machyshyn
63bea467c3 Merge branch 'hotfix/2.8.2' 2015-01-12 16:53:19 +02:00
Taras Machyshyn
cf449bba31 Merge branch 'hotfix/2.8.2' of ssh://172.20.0.1/var/git/espo/backend into hotfix/2.8.2 2015-01-12 15:18:25 +02:00
Taras Machyshyn
d247557fa9 Improving pt_BR translation by Bruno Franca 2015-01-12 15:18:01 +02:00
Taras Machyshyn
bcd1c9618d fixed error message with permission denied 2015-01-12 15:15:11 +02:00
yuri
cb1c87155f Merge branch 'hotfix/2.8.2' 2015-01-12 12:13:32 +02:00
yuri
0b757b94a4 Merge branch 'hotfix/2.8.2' of ssh://172.20.0.1/var/git/espo/backend into hotfix/2.8.2 2015-01-12 12:13:07 +02:00
yuri
4ffcca7978 sanitize 2015-01-12 12:12:47 +02:00
Taras Machyshyn
aac68b9624 Fix error when 'data' directory is not writable 2015-01-12 11:21:44 +02:00
yuri
4b0aeea778 Merge branch 'hotfix/2.8.2' 2015-01-12 11:17:58 +02:00
yuri
1b9522f89c Merge branch 'hotfix/2.8.2' of ssh://172.20.0.1/var/git/espo/backend into hotfix/2.8.2 2015-01-12 11:17:34 +02:00
yuri
391f77d6f8 navbar fix 2015-01-12 11:17:17 +02:00
Taras Machyshyn
feb8a300d9 remove test code 2015-01-09 17:43:28 +02:00
Taras Machyshyn
e2e77d59f9 Merge branch 'hotfix/2.8.2' of ssh://172.20.0.1/var/git/espo/backend into hotfix/2.8.2 2015-01-09 17:39:01 +02:00
Taras Machyshyn
2cb2d2cc2d bug fixing in Util 2015-01-09 17:38:39 +02:00
Taras Machyshyn
d62c83d869 'Language' saving improvements 2015-01-09 17:25:43 +02:00
Taras Machyshyn
0639ab8424 Json helper improvements 2015-01-09 17:16:41 +02:00
yuri
9bdc19d3c2 fix mentions 2015-01-09 11:54:27 +02:00
yuri
6e26c093fa remove trailing spaces 2015-01-09 11:42:35 +02:00
yuri
ca40c99ac2 improve relationship panels 2015-01-09 11:37:03 +02:00
yuri
6e1cef3d2f Merge branch 'hotfix/2.8.2' 2015-01-09 11:12:48 +02:00
yuri
cc6f89366a Import: utf8 message 2015-01-09 11:08:12 +02:00
yuri
d0e486a97c Merge branch 'hotfix/2.8.2' of ssh://172.20.0.1/var/git/espo/backend into hotfix/2.8.2 2015-01-09 10:58:45 +02:00
yuri
9c3db209d8 fix export 2015-01-09 10:58:18 +02:00
yuri
3ff6b93ccb Calendar: slotDuration changes 2015-01-08 15:09:12 +02:00
yuri
2bfc86323d remove spaces 2015-01-08 14:57:50 +02:00
Taras Machyshyn
ed1a58cd1f cache optimization 2015-01-08 13:10:41 +02:00
Yuri Kuznetsov
3f89bd23af Merge pull request #32 from alasdaircr/ArrayFilters
Allow filtering array field types. fixes #17
2015-01-08 12:18:36 +02:00
Taras Machyshyn
e2fa620a81 bug fixes for HookManager 2015-01-08 11:34:41 +02:00
Alasdair Campbell
05b3645321 Allow filtering array field types. fixes #17 2015-01-06 23:46:15 +00:00
yuri
0e71e145bd Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-01-06 13:21:45 +02:00
yuri
f13baad163 fix integration data 2015-01-06 13:20:24 +02:00
Taras Machyshyn
2d60fa1edc added custom loaders in metadata 'app' 2015-01-05 17:43:18 +02:00
Taras Machyshyn
2653873ff6 removed support custom loaders 2015-01-05 17:31:01 +02:00
Taras Machyshyn
d849cf1115 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2015-01-05 17:23:07 +02:00
Taras Machyshyn
28fcdca977 added custom loaders in metadata 'app' 2015-01-05 17:22:56 +02:00
yuri
3f620ae742 fix navbar resize 2015-01-05 17:14:21 +02:00
yuri
0af8dde821 quick create small fix 2015-01-05 16:41:10 +02:00
yuri
522931c64d meeting/call account field readOnly 2015-01-05 16:23:25 +02:00
yuri
265373bdcb change version 2014-12-30 11:56:16 +02:00
yuri
0dbd649bff Merge remote-tracking branch 'origin/hotfix/2.8.1' into hotfix/2.8.1 2014-12-30 11:55:21 +02:00
yuri
8fa4012267 merge origin 2014-12-30 11:54:37 +02:00
yuri
477a57571b fix preferences smtp password 2014-12-30 11:53:35 +02:00
yuri
1de853ab95 fix test send 2014-12-30 11:48:37 +02:00
yuri
4567d0de78 fix smtp password 2014-12-30 11:29:11 +02:00
Taras Machyshyn
b2cc82d7e1 ru_RU translation correction 2014-12-30 11:28:39 +02:00
Taras Machyshyn
d3710cd8c0 fix translation 2014-12-29 17:24:19 +02:00
Taras Machyshyn
2a4a9cbaa7 Improved russian traslation 2014-12-29 17:23:58 +02:00
yuri
e27d02e782 fix email and phone fields 2014-12-29 16:18:23 +02:00
yuri
ea1b7502bb remove $person static prop from Person entity 2014-12-25 16:54:43 +02:00
yuri
69c173bc6c change avatar color 2014-12-25 11:55:42 +02:00
yuri
944fa45e76 change identicon colors 2014-12-25 11:39:45 +02:00
yuri
eb2413085c cleanup 2014-12-25 11:32:15 +02:00
yuri
04ecebbfef remove color from identicons 2014-12-24 12:24:57 +02:00
yuri
585ae2a58f fix navbar issue 2014-12-24 12:03:52 +02:00
yuri
9aae12f9ae dont display avatars in activities panels 2014-12-24 11:08:04 +02:00
yuri
73c6cabaa7 fix model:populateFromDefaults 2014-12-23 17:22:49 +02:00
yuri
247075e168 Merge remote-tracking branch 'origin/hotfix/2.8.1' into hotfix/2.8.1 2014-12-23 15:40:01 +02:00
yuri
6791733761 merge origin 2014-12-23 15:39:10 +02:00
yuri
f6003088d8 identicons colors 2014-12-23 15:38:19 +02:00
Taras Machyshyn
95f93351ea Integration: fixed array type 2014-12-23 11:56:20 +02:00
yuri
b5bd7d043b clearnup 2014-12-22 17:38:32 +02:00
yuri
8095665835 fix dashboard preferences patch 2014-12-22 17:37:48 +02:00
yuri
dd3f9d5ff8 fix calendar dashlet 2014-12-22 17:21:52 +02:00
yuri
7c39df74bc fix calendar for mobile 2014-12-22 17:14:49 +02:00
Yuri Kuznetsov
0a1497e3e8 calendar resizr 2014-12-18 16:30:31 +02:00
Yuri Kuznetsov
25b81357c7 de_DE 2014-12-17 11:42:32 +02:00
Yuri Kuznetsov
f7f380ff04 Merge remote-tracking branch 'origin/master' 2014-12-17 10:36:20 +02:00
Yuri Kuznetsov
a09d99fe53 fix date field 2014-12-17 10:35:20 +02:00
Taras Machyshyn
bdd6538984 exclude custom Loaders from .gitignore 2014-12-16 12:34:45 +02:00
Yuri Kuznetsov
2787d3bc72 cleanup 2014-12-15 18:15:58 +02:00
Yuri Kuznetsov
72e53d096f replace tabs 2014-12-15 18:15:35 +02:00
Yuri Kuznetsov
acd48513f7 po.js and lang.js 2014-12-15 16:55:42 +02:00
Yuri Kuznetsov
6ffa5654ea fix calendar 2014-12-15 15:38:02 +02:00
Yuri Kuznetsov
b2dfdb3446 fix cache 2014-12-15 12:29:41 +02:00
Yuri Kuznetsov
dc5934a0ad change reminder interval 2014-12-15 11:41:11 +02:00
Yuri Kuznetsov
ec586874a6 change version 2014-12-15 11:39:32 +02:00
Yuri Kuznetsov
eb99d643b1 remove outline css 2014-12-12 16:37:56 +02:00
Yuri Kuznetsov
f6b37f346f search button 2014-12-12 15:38:11 +02:00
Yuri Kuznetsov
180b31f6fa less changes 2014-12-10 17:11:12 +02:00
Yuri Kuznetsov
b16de8591e cleanup 2014-12-10 16:17:35 +02:00
Yuri Kuznetsov
f87f418c1b globar search refactor 2014-12-10 16:04:05 +02:00
Yuri Kuznetsov
f79fd38478 sendEmailReminders record 2014-12-10 14:59:45 +02:00
Yuri Kuznetsov
2e13f73b34 email reminder 2014-12-10 13:14:26 +02:00
Yuri Kuznetsov
300f442b22 invitation email changes 2014-12-10 11:52:55 +02:00
Yuri Kuznetsov
0f1c31e55a some changes in lang 2014-12-09 18:11:05 +02:00
Yuri Kuznetsov
86633b31d3 change css 2014-12-09 17:20:04 +02:00
Yuri Kuznetsov
f60aa78dde popup norifications dev 2014-12-09 17:18:27 +02:00
Yuri Kuznetsov
ae77cb1d77 reminder css fix 2014-12-09 15:22:35 +02:00
Yuri Kuznetsov
74d99d8cda upgrade bootstrap 2014-12-09 15:13:20 +02:00
Yuri Kuznetsov
a90e0874bd reminders dev 2014-12-09 13:09:11 +02:00
Yuri Kuznetsov
141d20b472 reminders 2 2014-12-08 17:44:25 +02:00
Yuri Kuznetsov
6f08ecc1a7 reminders 1 2014-12-08 15:51:02 +02:00
Yuri Kuznetsov
3e4d6edac8 popup notifications 2 2014-12-05 18:12:18 +02:00
Yuri Kuznetsov
19784fc09c popup notifications 1 2014-12-05 17:46:19 +02:00
Yuri Kuznetsov
554f8cc37c big fix in repository 2014-12-04 17:07:45 +02:00
Yuri Kuznetsov
c6153f6af3 calendar fixes 2014-12-04 15:33:54 +02:00
Yuri Kuznetsov
048f5318fc fix calendar 2014-12-04 13:22:14 +02:00
Yuri Kuznetsov
62985c9776 calendar fixes 2014-12-03 18:32:22 +02:00
Yuri Kuznetsov
9b30c02c22 improve export 2014-12-03 16:37:10 +02:00
Yuri Kuznetsov
122f18e8bf remove duration field from mass update 2014-12-03 16:13:46 +02:00
Yuri Kuznetsov
9d316da4e0 fix meeting/call attendees 2014-12-03 15:50:00 +02:00
Yuri Kuznetsov
46439ff394 Merge branch 'hotfix/2.7.3' 2014-12-03 12:25:59 +02:00
Yuri Kuznetsov
f73a60ad9f merge hotfix/2.7.3 2014-12-03 12:04:54 +02:00
Yuri Kuznetsov
c05a153719 cleanup 2014-12-03 12:04:01 +02:00
Yuri Kuznetsov
094f39e987 fix settings array fields 2014-12-03 12:03:17 +02:00
Yuri Kuznetsov
c247def1bc stream changes 2014-12-03 11:20:12 +02:00
Yuri Kuznetsov
c7cd372554 clearnup 2014-12-03 11:06:59 +02:00
Yuri Kuznetsov
ea951a8738 changes in list and stream list 2014-12-03 11:01:09 +02:00
Yuri Kuznetsov
d9973bf353 cleanup 2014-12-03 10:31:51 +02:00
Yuri Kuznetsov
0baaf82909 added disable avatars param 2014-12-03 10:07:30 +02:00
Yuri Kuznetsov
e62cb881c9 Merge branch 'hotfix/2.7.3' 2014-12-03 09:57:05 +02:00
Yuri Kuznetsov
a965f6037f fix array field sortable 2014-12-03 09:55:50 +02:00
Yuri Kuznetsov
d6251f995c stream tab 2014-12-03 09:49:51 +02:00
Yuri Kuznetsov
483c971e3e stream centered 2014-12-02 17:47:28 +02:00
Yuri Kuznetsov
3186dcc65f stream and dashlet scopes 2014-12-02 17:33:22 +02:00
Yuri Kuznetsov
e7aeebee8d Merge remote-tracking branch 'origin/master' 2014-12-02 16:32:21 +02:00
Taras Machyshyn
14c3287131 changed indexes name 2014-12-02 16:32:00 +02:00
Yuri Kuznetsov
4754b2db2f Merge remote-tracking branch 'origin/master' 2014-12-02 16:13:22 +02:00
Yuri Kuznetsov
8fa0fae265 add indexes 2014-12-02 16:13:00 +02:00
Taras Machyshyn
dc4c4bd084 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-12-02 16:12:17 +02:00
Taras Machyshyn
6a5239cedc added camel case for indexes 2014-12-02 16:12:03 +02:00
Taras Machyshyn
9ea9429757 camel case convertation improvements 2014-12-02 16:11:22 +02:00
Yuri Kuznetsov
20f89cf75a layout manager fix 2014-12-02 15:35:30 +02:00
Yuri Kuznetsov
e8acf8aaaf layout manager fixes 2014-12-02 15:05:21 +02:00
Yuri Kuznetsov
0fac47e227 Merge remote-tracking branch 'origin/master' 2014-12-02 13:20:08 +02:00
Yuri Kuznetsov
fe3cc09623 orm refactor 2014-12-02 13:19:45 +02:00
Taras Machyshyn
91445f2f9c indexes improvements 2014-12-02 12:25:38 +02:00
Yuri Kuznetsov
053d516bc9 user avatars in user list view 2014-12-02 11:21:01 +02:00
Yuri Kuznetsov
63a9f67bd9 fix avatar 2014-12-01 16:58:09 +02:00
Yuri Kuznetsov
344f0227e9 Merge branch 'hotfix/2.7.2' 2014-12-01 14:22:04 +02:00
Yuri Kuznetsov
bdeaaa7965 version 2014-12-01 11:00:37 +02:00
Yuri Kuznetsov
2768a975d7 fix crypt 2014-12-01 10:42:56 +02:00
Yuri Kuznetsov
16384b9f72 Merge remote-tracking branch 'origin/master' 2014-11-28 18:14:25 +02:00
Yuri Kuznetsov
db9d8e1006 fix css 2014-11-28 18:14:05 +02:00
Taras Machyshyn
c7dd503d80 Integration Entity minor fixes 2014-11-28 17:49:30 +02:00
Taras Machyshyn
c96265e2a9 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-11-28 17:27:20 +02:00
Taras Machyshyn
ff35f7b1ff Integration entity fixes 2014-11-28 17:27:02 +02:00
Yuri Kuznetsov
ac1748067b fix crypt 2014-11-28 16:34:20 +02:00
Yuri Kuznetsov
a4de09ea36 clenup 2014-11-28 14:22:15 +02:00
Yuri Kuznetsov
0816831fe1 preview attachments in email 2014-11-28 12:57:12 +02:00
Yuri Kuznetsov
2533854745 Merge branch 'hotfix/2.7.1' into stable 2014-11-28 10:50:56 +02:00
Yuri Kuznetsov
0e83325e92 Merge branch 'hotfix/2.7.1' 2014-11-28 10:49:29 +02:00
Yuri Kuznetsov
261e52e64d Merge branch 'hotfix/2.7.1' 2014-11-27 17:22:47 +02:00
Yuri Kuznetsov
f1a990e80a fix email sender 2014-11-27 17:14:14 +02:00
Yuri Kuznetsov
a3a8110ae6 email archive: accountId from contact 2014-11-27 14:44:12 +02:00
Yuri Kuznetsov
82a213555b cleanup 2014-11-27 14:12:02 +02:00
Yuri Kuznetsov
3590ff2e33 Merge remote-tracking branch 'origin/master' 2014-11-27 14:07:47 +02:00
Yuri Kuznetsov
775cfec744 remove comment 2014-11-27 14:07:22 +02:00
Yuri Kuznetsov
9ca1d6608c archive relate by message id 2014-11-27 12:46:57 +02:00
Yuri Kuznetsov
59140b0814 fix side 2014-11-27 11:14:14 +02:00
Yuri Kuznetsov
90cf300334 cleanup 2014-11-27 11:01:11 +02:00
Taras Machyshyn
7bd3c7cb0d Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-11-27 10:27:09 +02:00
Taras Machyshyn
ce75cc90f5 added possibility to define 'view' for intergations 2014-11-27 10:26:52 +02:00
Yuri Kuznetsov
00a911434b change user list layout 2014-11-26 17:44:09 +02:00
Yuri Kuznetsov
69840086c9 Merge branch 'hotfix/2.7.1' 2014-11-26 16:48:12 +02:00
Yuri Kuznetsov
b72f6fa2cc manual merge with hotfix/2.7.1 2014-11-26 16:45:26 +02:00
Yuri Kuznetsov
9f9d0cb2dc cleanup 2014-11-26 16:43:11 +02:00
Yuri Kuznetsov
6a036595d6 dont notify about mention to current user 2014-11-26 16:29:47 +02:00
Yuri Kuznetsov
f4c57046dd cleanup 2014-11-26 15:47:58 +02:00
Yuri Kuznetsov
7b507f1bab edit note is wide 2014-11-26 15:35:05 +02:00
Yuri Kuznetsov
c0b8c5e7d2 change avatar size 2014-11-26 15:25:49 +02:00
Yuri Kuznetsov
6e49afddf0 Merge branch 'hotfix/2.7.1' 2014-11-26 14:54:50 +02:00
Yuri Kuznetsov
4908f281a3 ability to disable avatars 2014-11-26 12:37:59 +02:00
Yuri Kuznetsov
796b51d620 avatar for side field 2014-11-26 12:17:58 +02:00
Yuri Kuznetsov
9cc44cf917 modal backdrop param 2014-11-26 11:16:47 +02:00
Yuri Kuznetsov
9f7eecac73 attachment block fix 2014-11-26 10:47:14 +02:00
Yuri Kuznetsov
cba59fe847 EmailReceived Note: dont copy attachments 2014-11-26 10:17:36 +02:00
Yuri Kuznetsov
07df97ab9e ability to use entryPoint w/o build 2014-11-25 18:03:14 +02:00
Yuri Kuznetsov
0a1322843f Fix conflicts on merge with hotfix/2.7.1 2014-11-25 17:48:38 +02:00
Yuri Kuznetsov
6c6a3621e8 avatar 2014-11-25 17:37:16 +02:00
Yuri Kuznetsov
4a075819d1 avatar 3 2014-11-25 17:37:16 +02:00
Yuri Kuznetsov
3aa3914f3a fix notices 2014-11-25 17:37:16 +02:00
Yuri Kuznetsov
eef9c3e35c email sending fix 2014-11-25 17:37:16 +02:00
Taras Machyshyn
fe61fadc09 fileManager improvements 2014-11-25 17:37:16 +02:00
Taras Machyshyn
4c931514a2 E_STRICT notice fixes 2014-11-25 17:37:16 +02:00
Taras Machyshyn
8ad886d871 addded autoload.json for Resources 2014-11-25 16:44:50 +02:00
Yuri Kuznetsov
93b8745599 Merge branch 'hotfix/2.7.1' 2014-11-21 18:19:39 +02:00
Yuri Kuznetsov
fa25dc715f avatar 2 2014-11-21 17:00:30 +02:00
Yuri Kuznetsov
c010cf43bf avatar 1 2014-11-21 16:19:47 +02:00
Yuri Kuznetsov
51bdd15c9e change password 3 2014-11-20 16:25:43 +02:00
Yuri Kuznetsov
b48f10b45f load language on login form 2014-11-20 11:52:10 +02:00
Yuri Kuznetsov
027e928bd3 rename getController for app.js 2014-11-19 16:47:01 +02:00
Yuri Kuznetsov
3cfcfb02de changes in app.js 2014-11-19 16:42:20 +02:00
Yuri Kuznetsov
322df7ff68 Merge branch 'hotfix/2.7.1' 2014-11-19 16:05:45 +02:00
Yuri Kuznetsov
d58b9cac40 change password 2 2014-11-19 16:03:33 +02:00
Yuri Kuznetsov
cca6567bbd fix query 2014-11-19 16:03:33 +02:00
Yuri Kuznetsov
26eb194ccb small change 2014-11-19 16:03:33 +02:00
Yuri Kuznetsov
9b42ae41e7 change password 1 2014-11-19 16:03:33 +02:00
Yuri Kuznetsov
83916cacd9 cleanup 2014-11-19 16:03:33 +02:00
Yuri Kuznetsov
85b484c04e use jsonObject 2014-11-19 16:03:33 +02:00
Yuri Kuznetsov
0d302e99af clearnup 2014-11-19 16:03:33 +02:00
Taras Machyshyn
ae4a6fa3d2 EmailTemplate minor improvements 2014-11-18 17:17:26 +02:00
Taras Machyshyn
8f64fdd025 Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-11-18 13:36:53 +02:00
Taras Machyshyn
5ee83505af metedata improvements 2014-11-18 13:36:37 +02:00
Yuri Kuznetsov
4527358a53 Merge remote-tracking branch 'origin/master' 2014-11-18 11:58:54 +02:00
Yuri Kuznetsov
51cca50828 some changes in select manager 2014-11-18 11:50:27 +02:00
Taras Machyshyn
8f1752575a Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-11-17 17:06:25 +02:00
Taras Machyshyn
29c39fb4fd use MyISAM engine for database 2014-11-17 17:06:04 +02:00
Yuri Kuznetsov
63663ccf6c Merge branch 'master' of ssh://172.20.0.1/var/git/espo/backend 2014-11-17 16:42:48 +02:00
Yuri Kuznetsov
1ba81c3350 Merge branch 'hotfix/2.7.1' 2014-11-17 16:37:15 +02:00
Taras Machyshyn
f7879f425f added 'indexes' section in entityDefs 2014-11-17 13:11:09 +02:00
Yuri Kuznetsov
93ed5dce6b merge hotfix/2.7.1 2014-11-17 12:07:03 +02:00
Yuri Kuznetsov
a08adcf6d5 change readme 2014-11-14 16:17:30 +02:00
Yuri Kuznetsov
a7bad6aa58 added repository field to package.json 2014-11-14 16:00:07 +02:00
Yuri Kuznetsov
14d83c3a19 Merge branch 'master' into stable 2014-11-12 16:58:35 +02:00
1026 changed files with 21396 additions and 9800 deletions

2
.gitignore vendored
View File

@@ -4,7 +4,6 @@
/data/preferences/*
/data/.backup/*
/data/config.php
/custom
/build
/node_modules
/client
@@ -14,3 +13,4 @@
/tests/testData/cache/*
composer.phar
vendor/
/custom/Espo/Custom/Resources/*

View File

@@ -1,49 +1,69 @@
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
************************************************************************/
module.exports = function (grunt) {
var jsFilesToMinify = [
'client/lib/jquery-2.0.2.min.js',
'client/lib/underscore-min.js',
'client/lib/backbone-min.js',
'client/lib/handlebars.js',
'client/lib/base64.js',
'client/lib/jquery-ui.min.js',
'client/lib/moment.min.js',
'client/lib/moment-timezone-with-data.min.js',
'client/lib/jquery.timepicker.min.js',
'client/lib/jquery.autocomplete.js',
'client/lib/bootstrap.min.js',
'client/lib/bootstrap-datepicker.js',
'client/lib/bull.min.js',
'client/src/namespace.js',
'client/src/exceptions.js',
'client/src/app.js',
'client/src/utils.js',
'client/src/storage.js',
'client/src/loader.js',
'client/src/pre-loader.js',
'client/src/ui.js',
'client/src/acl.js',
'client/src/model.js',
'client/src/model-offline.js',
'client/src/metadata.js',
'client/src/language.js',
'client/src/cache.js',
'client/src/controller.js',
'client/src/router.js',
'client/src/date-time.js',
'client/src/field-manager.js',
'client/src/search-manager.js',
'client/src/collection.js',
'client/src/multi-collection.js',
'client/src/view-helper.js',
'client/src/layout-manager.js',
'client/src/model-factory.js',
'client/src/collection-factory.js',
'client/src/models/settings.js',
'client/src/models/user.js',
'client/src/models/preferences.js',
'client/src/controllers/base.js',
'client/src/view.js',
'client/lib/jquery-2.0.2.min.js',
'client/lib/underscore-min.js',
'client/lib/backbone-min.js',
'client/lib/handlebars.js',
'client/lib/base64.js',
'client/lib/jquery-ui.min.js',
'client/lib/moment.min.js',
'client/lib/moment-timezone-with-data.min.js',
'client/lib/jquery.timepicker.min.js',
'client/lib/jquery.autocomplete.js',
'client/lib/bootstrap.min.js',
'client/lib/bootstrap-datepicker.js',
'client/lib/bull.min.js',
'client/src/namespace.js',
'client/src/exceptions.js',
'client/src/app.js',
'client/src/utils.js',
'client/src/storage.js',
'client/src/loader.js',
'client/src/pre-loader.js',
'client/src/ui.js',
'client/src/acl.js',
'client/src/model.js',
'client/src/model-offline.js',
'client/src/metadata.js',
'client/src/language.js',
'client/src/cache.js',
'client/src/controller.js',
'client/src/router.js',
'client/src/date-time.js',
'client/src/field-manager.js',
'client/src/search-manager.js',
'client/src/collection.js',
'client/src/multi-collection.js',
'client/src/view-helper.js',
'client/src/layout-manager.js',
'client/src/model-factory.js',
'client/src/collection-factory.js',
'client/src/models/settings.js',
'client/src/models/user.js',
'client/src/models/preferences.js',
'client/src/controllers/base.js',
'client/src/view.js',
];
grunt.initConfig({
@@ -106,6 +126,7 @@ module.exports = function (grunt) {
'modules/**',
'img/**',
'css/**',
'sounds/**'
],
dest: 'build/tmp/client',
},
@@ -119,7 +140,7 @@ module.exports = function (grunt) {
cwd: 'frontend/client/lib',
src: '**',
dest: 'build/tmp/client/lib/',
},
},
backend: {
expand: true,
dot: true,
@@ -152,7 +173,7 @@ module.exports = function (grunt) {
options: {
mode: '755'
},
php: {
php: {
options: {
mode: '644'
},
@@ -160,7 +181,7 @@ module.exports = function (grunt) {
'build/EspoCRM-<%= pkg.version %>/**/*.php',
'build/EspoCRM-<%= pkg.version %>/**/*.json',
'build/EspoCRM-<%= pkg.version %>/**/*.config',
'build/EspoCRM-<%= pkg.version %>/**/.htaccess',
'build/EspoCRM-<%= pkg.version %>/**/.htaccess',
'build/EspoCRM-<%= pkg.version %>/client/**/*.js',
'build/EspoCRM-<%= pkg.version %>/client/**/*.css',
'build/EspoCRM-<%= pkg.version %>/client/**/*.tpl',
@@ -230,7 +251,7 @@ module.exports = function (grunt) {
'clean:start',
'mkdir:tmp',
'less',
'cssmin',
'cssmin',
'uglify',
'copy:frontendFolders',
'copy:frontendHtml',
@@ -240,6 +261,6 @@ module.exports = function (grunt) {
'copy:final',
'chmod',
'clean:final',
]);
]);
};

View File

@@ -25,7 +25,7 @@ If your repository is accessible via a web server then you can run EspoCRM by ur
### How to build
You need to have nodejs installed.
You need to have nodejs and Grunt CLI installed.
1. Change to the project's root directory.
2. Install project dependencies with `npm install`.

View File

@@ -1,4 +1,24 @@
<?php
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
************************************************************************/
require_once('../../bootstrap.php');

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
@@ -18,33 +18,36 @@
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
************************************************************************/
************************************************************************/
namespace Espo\Controllers;
use \Espo\Core\Exceptions\BadRequest;
class App extends \Espo\Core\Controllers\Record
class App extends \Espo\Core\Controllers\Base
{
public function actionUser()
{
{
$preferences = $this->getPreferences()->toArray();
unset($preferences['smtpPassword']);
return array(
'user' => $this->getUser()->toArray(),
'acl' => $this->getAcl()->toArray(),
'preferences' => $this->getPreferences()->toArray(),
'preferences' => $preferences,
'token' => $this->getUser()->get('token')
);
);
}
public function actionDestroyAuthToken($params, $data)
{
$token = $data['token'];
{
$token = $data['token'];
if (empty($token)) {
throw new BadRequest();
}
$auth = new \Espo\Core\Utils\Auth($this->getContainer());
return $auth->destroyAuthToken($token);
return $auth->destroyAuthToken($token);
}
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
@@ -18,16 +18,16 @@
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
************************************************************************/
************************************************************************/
namespace Espo\Controllers;
use \Espo\Core\Exceptions\Forbidden;
class EmailAccount extends \Espo\Core\Controllers\Record
{
{
public function actionGetFolders($params, $data, $request)
{
{
return $this->getRecordService()->getFolders(array(
'host' => $request->get('host'),
'port' => $request->get('port'),

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify

View File

@@ -0,0 +1,227 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
************************************************************************/
namespace Espo\Controllers;
use \Espo\Core\Exceptions\BadRequest;
use \Espo\Core\Exceptions\Forbidden;
use \Espo\Core\Exceptions\Error;
class EntityManager extends \Espo\Core\Controllers\Base
{
protected function checkControllerAccess()
{
if (!$this->getUser()->isAdmin()) {
throw new Forbidden();
}
}
public function actionCreateEntity($params, $data, $request)
{
if (!$request->isPost()) {
throw new BadRequest();
}
if (empty($data['name']) || empty($data['type'])) {
throw new BadRequest();
}
$name = $data['name'];
$type = $data['type'];
$name = filter_var($name, \FILTER_SANITIZE_STRING);
$type = filter_var($type, \FILTER_SANITIZE_STRING);
$params = array();
if (!empty($data['labelSingular'])) {
$params['labelSingular'] = $data['labelSingular'];
}
if (!empty($data['labelPlural'])) {
$params['labelPlural'] = $data['labelPlural'];
}
if (!empty($data['stream'])) {
$params['stream'] = $data['stream'];
}
$result = $this->getContainer()->get('entityManagerUtil')->create($name, $type, $params);
if ($result) {
$tabList = $this->getConfig()->get('tabList', []);
$tabList[] = $name;
$this->getConfig()->set('tabList', $tabList);
$this->getConfig()->save();
$this->getContainer()->get('dataManager')->rebuild();
} else {
throw new Error();
}
return true;
}
public function actionUpdateEntity($params, $data, $request)
{
if (!$request->isPost()) {
throw new BadRequest();
}
if (empty($data['name'])) {
throw new BadRequest();
}
$name = $data['name'];
$name = filter_var($name, \FILTER_SANITIZE_STRING);
$result = $this->getContainer()->get('entityManagerUtil')->update($name, $data);
if ($result) {
$this->getContainer()->get('dataManager')->clearCache();
} else {
throw new Error();
}
return true;
}
public function actionRemoveEntity($params, $data, $request)
{
if (!$request->isPost()) {
throw new BadRequest();
}
if (empty($data['name'])) {
throw new BadRequest();
}
$name = $data['name'];
$name = filter_var($name, \FILTER_SANITIZE_STRING);
$result = $this->getContainer()->get('entityManagerUtil')->delete($name);
if ($result) {
$tabList = $this->getConfig()->get('tabList', []);
if (($key = array_search($name, $tabList)) !== false) {
unset($tabList[$key]);
$tabList = array_values($tabList);
}
$this->getConfig()->set('tabList', $tabList);
$this->getConfig()->save();
$this->getContainer()->get('dataManager')->clearCache();
} else {
throw new Error();
}
return true;
}
public function actionCreateLink($params, $data, $request)
{
if (!$request->isPost()) {
throw new BadRequest();
}
$paramList = [
'entity',
'entityForeign',
'link',
'linkForeign',
'label',
'labelForeign',
'linkType'
];
$d = array();
foreach ($paramList as $item) {
if (empty($data[$item])) {
throw new BadRequest();
}
$d[$item] = filter_var($data[$item], \FILTER_SANITIZE_STRING);
}
$result = $this->getContainer()->get('entityManagerUtil')->createLink($d);
if ($result) {
$this->getContainer()->get('dataManager')->rebuild();
} else {
throw new Error();
}
return true;
}
public function actionUpdateLink($params, $data, $request)
{
if (!$request->isPost()) {
throw new BadRequest();
}
$paramList = [
'entity',
'entityForeign',
'link',
'linkForeign',
'label',
'labelForeign'
];
$d = array();
foreach ($paramList as $item) {
$d[$item] = filter_var($data[$item], \FILTER_SANITIZE_STRING);
}
$result = $this->getContainer()->get('entityManagerUtil')->updateLink($d);
if ($result) {
$this->getContainer()->get('dataManager')->clearCache();
} else {
throw new Error();
}
return true;
}
public function actionRemoveLink($params, $data, $request)
{
if (!$request->isPost()) {
throw new BadRequest();
}
$paramList = [
'entity',
'link',
];
$d = array();
foreach ($paramList as $item) {
$d[$item] = filter_var($data[$item], \FILTER_SANITIZE_STRING);
}
$result = $this->getContainer()->get('entityManagerUtil')->deleteLink($d);
if ($result) {
$this->getContainer()->get('dataManager')->clearCache();
} else {
throw new Error();
}
return true;
}
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
@@ -28,10 +28,10 @@ use \Espo\Core\Exceptions\Forbidden;
class ExternalAccount extends \Espo\Core\Controllers\Record
{
public static $defaultAction = 'list';
public function actionList($params, $data, $request)
{
$integrations = $this->getEntityManager()->getRepository('Integration')->find();
$integrations = $this->getEntityManager()->getRepository('Integration')->find();
$arr = array();
foreach ($integrations as $entity) {
if ($entity->get('enabled') && $this->getMetadata()->get('integrations.' . $entity->id .'.allowUserAccounts')) {
@@ -44,22 +44,22 @@ class ExternalAccount extends \Espo\Core\Controllers\Record
'list' => $arr
);
}
public function actionGetOAuth2Info($params, $data, $request)
{
$id = $request->get('id');
list($integration, $userId) = explode('__', $id);
if ($this->getUser()->id != $userId) {
throw new Forbidden();
}
}
$entity = $this->getEntityManager()->getEntity('Integration', $integration);
if ($entity) {
return array(
'clientId' => $entity->get('clientId'),
'redirectUri' => $this->getConfig()->get('siteUrl') . '/oauthcallback',
'redirectUri' => $this->getConfig()->get('siteUrl') . '?entryPoint=oauthCallback',
'isConnected' => $this->getRecordService()->ping($integration, $userId)
);
}
@@ -67,57 +67,57 @@ class ExternalAccount extends \Espo\Core\Controllers\Record
public function actionRead($params, $data, $request)
{
list($integration, $userId) = explode('__', $params['id']);
list($integration, $userId) = explode('__', $params['id']);
if ($this->getUser()->id != $userId) {
throw new Forbidden();
}
$entity = $this->getEntityManager()->getEntity('ExternalAccount', $params['id']);
}
$entity = $this->getEntityManager()->getEntity('ExternalAccount', $params['id']);
return $entity->toArray();
}
public function actionUpdate($params, $data)
{
return $this->actionPatch($params, $data);
}
public function actionPatch($params, $data)
{
list($integration, $userId) = explode('__', $params['id']);
if ($this->getUser()->id != $userId) {
throw new Forbidden();
}
if (isset($data['enabled']) && !$data['enabled']) {
$data['data'] = null;
}
}
$entity = $this->getEntityManager()->getEntity('ExternalAccount', $params['id']);
$entity->set($data);
$this->getEntityManager()->saveEntity($entity);
return $entity->toArray();
return $entity->toArray();
}
public function actionAuthorizationCode($params, $data, $request)
{
if (!$request->isPost()) {
throw new Error('Bad HTTP method type.');
}
}
$id = $data['id'];
$code = $data['code'];
list($integration, $userId) = explode('__', $id);
list($integration, $userId) = explode('__', $id);
if ($this->getUser()->id != $userId) {
throw new Forbidden();
}
$service = $this->getRecordService();
$service = $this->getRecordService();
return $service->authorizationCode($integration, $userId, $code);
}
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
@@ -33,7 +33,7 @@ class Layout extends \Espo\Core\Controllers\Base
{
$data = $this->getContainer()->get('layout')->get($params['scope'], $params['name']);
if (empty($data)) {
throw new NotFound("Layout " . $params['scope'] . ":" . $params['name'] . ' is not found');
throw new NotFound("Layout " . $params['scope'] . ":" . $params['name'] . ' is not found.');
}
return $data;
}
@@ -43,16 +43,18 @@ class Layout extends \Espo\Core\Controllers\Base
if (!$this->getUser()->isAdmin()) {
throw new Forbidden();
}
$result = $this->getContainer()->get('layout')->set($data, $params['scope'], $params['name']);
$layoutManager = $this->getContainer()->get('layout');
$layoutManager->set($data, $params['scope'], $params['name']);
$result = $layoutManager->save();
if ($result === false) {
throw new Error("Error while saving layout");
throw new Error("Error while saving layout.");
}
$this->getContainer()->get('dataManager')->updateCacheTimestamp();
return $this->getContainer()->get('layout')->get($params['scope'], $params['name']);
return $layoutManager->get($params['scope'], $params['name']);
}
public function actionPatch($params, $data)

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
@@ -57,6 +57,10 @@ class Settings extends \Espo\Core\Controllers\Base
throw new Forbidden();
}
if (isset($data['useCache']) && $data['useCache'] != $this->getConfig()->get('useCache')) {
$this->getContainer()->get('dataManager')->clearCache();
}
$this->getConfig()->setData($data, $this->getUser()->isAdmin());
$result = $this->getConfig()->save();
if ($result === false) {

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
@@ -25,11 +25,12 @@ namespace Espo\Controllers;
use \Espo\Core\Exceptions\Error;
use \Espo\Core\Exceptions\NotFound;
use \Espo\Core\Exceptions\Forbidden;
use \Espo\Core\Exceptions\BadRequest;
class User extends \Espo\Core\Controllers\Record
{
{
public function actionAcl($params, $data, $request)
{
{
$userId = $request->get('id');
if (empty($userId)) {
throw new Error();
@@ -46,12 +47,54 @@ class User extends \Espo\Core\Controllers\Record
$acl = new \Espo\Core\Acl($user, $this->getConfig(), $this->getContainer()->get('fileManager'), $this->getMetadata());
return $acl->toArray();
return $acl->toArray();
}
public function actionChangeOwnPassword($params, $data)
{
return $this->getService('User')->changePassword($this->getUser()->id, $data['password']);
}
public function actionChangePasswordByRequest($params, $data, $request)
{
if (!$request->isPost()) {
throw new Forbidden();
}
if (empty($data['requestId']) || empty($data['password'])) {
throw new BadRequest();
}
$p = $this->getEntityManager()->getRepository('PasswordChangeRequest')->where(array(
'requestId' => $data['requestId']
))->findOne();
if (!$p) {
throw new Forbidden();
}
$userId = $p->get('userId');
if (!$userId) {
throw new Error();
}
$this->getEntityManager()->removeEntity($p);
return $this->getService('User')->changePassword($userId, $data['password']);
}
public function actionPasswordChangeRequest($params, $data, $request)
{
if (!$request->isPost()) {
throw new Forbidden();
}
if (empty($data['userName']) || empty($data['emailAddress'])) {
throw new BadRequest();
}
$userName = $data['userName'];
$emailAddress = $data['emailAddress'];
return $this->getService('User')->passwordChangeRequest($userName, $emailAddress);
}
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
@@ -218,14 +218,14 @@ class Acl
$userRoles = $this->user->get('roles');
foreach ($userRoles as $role) {
$aclTables[] = json_decode($role->get('data'));
$aclTables[] = $role->get('data');
}
$teams = $this->user->get('teams');
foreach ($teams as $team) {
$teamRoles = $team->get('roles');
foreach ($teamRoles as $role) {
$aclTables[] = json_decode($role->get('data'));
$aclTables[] = $role->get('data');
}
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
@@ -43,6 +43,8 @@ class Application
date_default_timezone_set('UTC');
$GLOBALS['log'] = $this->container->get('log');
$this->initAutoloads();
}
public function getSlim()
@@ -88,6 +90,7 @@ class Application
$html = file_get_contents('main.html');
$html = str_replace('{{cacheTimestamp}}', $config->get('cacheTimestamp', 0), $html);
$html = str_replace('{{useCache}}', $config->get('useCache') ? 'true' : 'false' , $html);
$html = str_replace('{{runScript}}', 'app.start();' , $html);
echo $html;
exit;
}
@@ -151,7 +154,11 @@ class Application
$container = $this->getContainer();
$slim = $this->getSlim();
$auth = $this->getAuth();
try {
$auth = $this->getAuth();
} catch (\Exception $e) {
$container->get('output')->processError($e->getMessage(), $e->getCode());
}
$apiAuth = new \Espo\Core\Utils\Api\Auth($auth);
$this->getSlim()->add($apiAuth);
@@ -215,7 +222,6 @@ class Application
});
}
protected function initRoutes()
{
$routes = new \Espo\Core\Utils\Route($this->getContainer()->get('config'), $this->getMetadata(), $this->getContainer()->get('fileManager'));
@@ -238,5 +244,34 @@ class Application
}
}
}
protected function initAutoloads()
{
$autoload = new \Espo\Core\Utils\Autoload($this->getContainer()->get('config'), $this->getMetadata(), $this->getContainer()->get('fileManager'));
try {
$autoloadList = $autoload->getAll();
} catch (\Exception $e) {} //bad permissions
if (empty($autoloadList)) {
return;
}
$namespacesPath = 'vendor/composer/autoload_namespaces.php';
$existingNamespaces = file_exists($namespacesPath) ? include($namespacesPath) : array();
if (!empty($existingNamespaces) && is_array($existingNamespaces)) {
$existingNamespaces = array_keys($existingNamespaces);
}
$classLoader = new \Composer\Autoload\ClassLoader();
foreach ($autoloadList as $prefix => $path) {
if (!in_array($prefix, $existingNamespaces)) {
$classLoader->add($prefix, $path);
}
}
$classLoader->register(true);
}
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
@@ -51,9 +51,16 @@ class Container
$obj = $this->$loadMethod();
$this->data[$name] = $obj;
} else {
$className = '\Espo\Custom\Core\Loaders\\'.ucfirst($name);
if (!class_exists($className)) {
$className = '\Espo\Core\Loaders\\'.ucfirst($name);
try {
$className = $this->get('metadata')->get('app.loaders.' . ucfirst($name));
} catch (\Exception $e) {}
if (!isset($className) || !class_exists($className)) {
$className = '\Espo\Custom\Core\Loaders\\'.ucfirst($name);
if (!class_exists($className)) {
$className = '\Espo\Core\Loaders\\'.ucfirst($name);
}
}
if (class_exists($className)) {
@@ -64,7 +71,7 @@ class Container
return null;
}
protected function getServiceClassName($name, $default)
{
$metadata = $this->get('metadata');
@@ -72,6 +79,28 @@ class Container
return $className;
}
protected function loadLog()
{
$logConfig = $this->get('config')->get('logger');
$log = new \Espo\Core\Utils\Log('Espo');
$levelCode = $log->getLevelCode($logConfig['level']);
if ($logConfig['isRotate']) {
$handler = new \Espo\Core\Utils\Log\Monolog\Handler\RotatingFileHandler($logConfig['path'], $logConfig['maxRotateFiles'], $levelCode);
} else {
$handler = new \Espo\Core\Utils\Log\Monolog\Handler\StreamHandler($logConfig['path'], $levelCode);
}
$log->pushHandler($handler);
$errorHandler = new \Monolog\ErrorHandler($log);
$errorHandler->registerExceptionHandler(null, false);
$errorHandler->registerErrorHandler(array(), false);
return $log;
}
protected function loadContainer()
{
return $this;
@@ -204,7 +233,7 @@ class Container
$this->get('preferences')
);
}
private function loadCrypt()
{
return new \Espo\Core\Utils\Crypt(
@@ -214,7 +243,7 @@ class Container
private function loadScheduledJob()
{
return new \Espo\Core\Cron\ScheduledJob(
return new \Espo\Core\Utils\ScheduledJob(
$this
);
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
@@ -25,6 +25,7 @@ namespace Espo\Core\Controllers;
use \Espo\Core\Exceptions\Error;
use \Espo\Core\Exceptions\Forbidden;
use \Espo\Core\Exceptions\NotFound;
use \Espo\Core\Exceptions\BadRequest;
use \Espo\Core\Utils\Util;
class Record extends Base
@@ -301,5 +302,24 @@ class Record extends Base
$id = $params['id'];
return $this->getRecordService()->unfollow($id);
}
public function actionMerge($params, $data, $request)
{
if (!$request->isPost()) {
throw new BadRequest();
}
if (empty($data['targetId']) || empty($data['sourceIds']) || !is_array($data['sourceIds'])) {
throw new BadRequest();
}
$targetId = $data['targetId'];
$sourceIds = $data['sourceIds'];
if (!$this->getAcl()->check($this->name, 'edit')) {
throw new Forbidden();
}
return $this->getRecordService()->merge($targetId, $sourceIds);
}
}

View File

@@ -1,67 +0,0 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
************************************************************************/
namespace Espo\Core\Cron;
use Espo\Core\Utils\Json,
Espo\Core\Exceptions\NotFound;
class Service
{
private $serviceFactory;
public function __construct(\Espo\Core\ServiceFactory $serviceFactory)
{
$this->serviceFactory = $serviceFactory;
}
protected function getServiceFactory()
{
return $this->serviceFactory;
}
public function run($job)
{
$serviceName = $job['service_name'];
if (!$this->getServiceFactory()->checkExists($serviceName)) {
throw new NotFound();
}
$service = $this->getServiceFactory()->create($serviceName);
$serviceMethod = $job['method'];
if (!method_exists($service, $serviceMethod)) {
throw new NotFound();
}
$data = $job['data'];
if (Json::isJSON($data)) {
$data = Json::decode($data, true);
}
$service->$serviceMethod($data);
}
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
@@ -22,17 +22,18 @@
namespace Espo\Core;
use \PDO;
use Espo\Core\Utils\Json;
use Espo\Core\Exceptions\NotFound;
class CronManager
{
private $container;
private $config;
private $fileManager;
private $entityManager;
private $scheduledJobCron;
private $serviceCron;
private $jobService;
private $scheduledJobService;
private $scheduledJobUtil;
const PENDING = 'Pending';
const RUNNING = 'Running';
@@ -41,19 +42,18 @@ class CronManager
protected $lastRunTime = 'data/cache/application/cronLastRunTime.php';
public function __construct(\Espo\Core\Container $container)
{
$this->container = $container;
$this->config = $this->container->get('config');
$this->fileManager = $this->container->get('fileManager');
$this->entityManager = $this->container->get('entityManager');
$this->serviceFactory = $this->container->get('serviceFactory');
$this->scheduledJobCron = $this->container->get('scheduledJob');
$this->serviceCron = new \Espo\Core\Cron\Service( $this->container->get('serviceFactory'));
$this->jobService = $this->container->get('serviceFactory')->create('job');
$this->scheduledJobService = $this->container->get('serviceFactory')->create('scheduledJob');
$this->scheduledJobUtil = $this->container->get('scheduledJob');
$this->cronJob = new \Espo\Core\Utils\Cron\Job($this->config, $this->entityManager);
$this->cronScheduledJob = new \Espo\Core\Utils\Cron\ScheduledJob($this->config, $this->entityManager);
}
protected function getContainer()
@@ -71,30 +71,34 @@ class CronManager
return $this->fileManager;
}
protected function getJobService()
protected function getEntityManager()
{
return $this->jobService;
return $this->entityManager;
}
protected function getScheduledJobService()
protected function getServiceFactory()
{
return $this->scheduledJobService;
return $this->serviceFactory;
}
protected function getScheduledJobCron()
protected function getScheduledJobUtil()
{
return $this->scheduledJobCron;
return $this->scheduledJobUtil;
}
protected function getServiceCron()
protected function getCronJob()
{
return $this->serviceCron;
return $this->cronJob;
}
protected function getCronScheduledJob()
{
return $this->cronScheduledJob;
}
protected function getLastRunTime()
{
$lastRunTime = $this->getFileManager()->getContents($this->lastRunTime);
$lastRunTime = $this->getFileManager()->getPhpContents($this->lastRunTime);
if (!is_int($lastRunTime)) {
$lastRunTime = time() - (intval($this->getConfig()->get('cron.minExecutionTime')) + 60);
}
@@ -104,7 +108,7 @@ class CronManager
protected function setLastRunTime($time)
{
return $this->getFileManager()->putContentsPHP($this->lastRunTime, $time);
return $this->getFileManager()->putPhpContents($this->lastRunTime, $time);
}
protected function checkLastRunTime()
@@ -120,65 +124,144 @@ class CronManager
return false;
}
/**
* Run Cron
*
* @return void
*/
public function run()
{
if (!$this->checkLastRunTime()) {
$GLOBALS['log']->info('Cron Manager: Stop cron running, too frequency execution');
return; //stop cron running, too frequency execution
$GLOBALS['log']->info('CronManager: Stop cron running, too frequent execution.');
return;
}
$this->setLastRunTime(time());
$entityManager = $this->getEntityManager();
$cronJob = $this->getCronJob();
$cronScheduledJob = $this->getCronScheduledJob();
//Check scheduled jobs and create related jobs
$this->createJobsFromScheduledJobs();
$pendingJobs = $this->getJobService()->getPendingJobs();
$pendingJobs = $cronJob->getPendingJobs();
foreach ($pendingJobs as $job) {
$this->getJobService()->updateEntity($job['id'], array(
'status' => self::RUNNING,
));
$jobEntity = $entityManager->getEntity('Job', $job['id']);
if (!isset($jobEntity)) {
$GLOBALS['log']->error('CronManager: empty Job entity ['.$job['id'].'].');
continue;
}
$jobEntity->set('status', self::RUNNING);
$entityManager->saveEntity($jobEntity);
$isSuccess = true;
try {
if (!empty($job['scheduled_job_id'])) {
$this->getScheduledJobCron()->run($job);
$this->runScheduledJob($job);
} else {
$this->getServiceCron()->run($job);
$this->runService($job);
}
} catch (\Exception $e) {
$isSuccess = false;
$GLOBALS['log']->error('Failed job running, job ['.$job['id'].']. Error Details: '.$e->getMessage());
$GLOBALS['log']->error('CronManager: Failed job running, job ['.$job['id'].']. Error Details: '.$e->getMessage());
}
$status = $isSuccess ? self::SUCCESS : self::FAILED;
$this->getJobService()->updateEntity($job['id'], array(
'status' => $status,
));
$jobEntity->set('status', $status);
$entityManager->saveEntity($jobEntity);
//set status in the schedulerJobLog
if (!empty($job['scheduled_job_id'])) {
$this->getScheduledJobService()->addLogRecord($job['scheduled_job_id'], $status);
$cronScheduledJob->addLogRecord($job['scheduled_job_id'], $status);
}
}
}
/**
* Run Scheduled Job
*
* @param array $job
*
* @return void
*/
protected function runScheduledJob(array $job)
{
$jobName = $job['method'];
$className = $this->getScheduledJobUtil()->get($jobName);
if ($className === false) {
throw new NotFound();
}
$jobClass = new $className($this->container);
$method = $this->getScheduledJobUtil()->getMethodName();
if (!method_exists($jobClass, $method)) {
throw new NotFound();
}
$jobClass->$method();
}
/**
* Run Service
*
* @param array $job
*
* @return void
*/
protected function runService(array $job)
{
$serviceName = $job['service_name'];
if (!$this->getServiceFactory()->checkExists($serviceName)) {
throw new NotFound();
}
$service = $this->getServiceFactory()->create($serviceName);
$serviceMethod = $job['method'];
if (!method_exists($service, $serviceMethod)) {
throw new NotFound();
}
$data = $job['data'];
if (Json::isJSON($data)) {
$data = Json::decode($data, true);
}
$service->$serviceMethod($data);
}
/**
* Check scheduled jobs and create related jobs
* @return array List of created Jobs
*
* @return array List of created Jobs
*/
protected function createJobsFromScheduledJobs()
{
$activeScheduledJobs = $this->getScheduledJobService()->getActiveJobs();
$entityManager = $this->getEntityManager();
$activeScheduledJobs = $this->getCronScheduledJob()->getActiveJobs();
$cronJob = $this->getCronJob();
$runningScheduledJobs = $cronJob->getActiveJobs('scheduled_job_id', self::RUNNING, PDO::FETCH_COLUMN);
$createdJobs = array();
foreach ($activeScheduledJobs as $scheduledJob) {
if (in_array($scheduledJob['id'], $runningScheduledJobs)) {
continue;
}
$scheduling = $scheduledJob['scheduling'];
$cronExpression = \Cron\CronExpression::factory($scheduling);
@@ -186,26 +269,30 @@ class CronManager
try {
$prevDate = $cronExpression->getPreviousRunDate()->format('Y-m-d H:i:s');
} catch (\Exception $e) {
$GLOBALS['log']->error('ScheduledJob ['.$scheduledJob['id'].']: CronExpression - Impossible CRON expression ['.$scheduling.']');
$GLOBALS['log']->error('CronManager: ScheduledJob ['.$scheduledJob['id'].']: CronExpression - Impossible CRON expression ['.$scheduling.']');
continue;
}
if ($cronExpression->isDue()) {
$prevDate = date('Y-m-d H:i:00');
$prevDate = date('Y-m-d H:i:s');
}
$existsJob = $this->getJobService()->getJobByScheduledJob($scheduledJob['id'], $prevDate);
$existsJob = $cronJob->getJobByScheduledJob($scheduledJob['id'], $prevDate);
if (!isset($existsJob) || empty($existsJob)) {
//create a job
$data = array(
//create a new job
$jobEntity = $entityManager->getEntity('Job');
$jobEntity->set(array(
'name' => $scheduledJob['name'],
'status' => self::PENDING,
'scheduledJobId' => $scheduledJob['id'],
'executeTime' => $prevDate,
'method' => $scheduledJob['job'],
);
$createdJobs[] = $this->getJobService()->createEntity($data);
));
$jobEntityId = $entityManager->saveEntity($jobEntity);
if (!empty($jobEntityId)) {
$createdJobs[] = $jobEntityId;
}
}
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
@@ -18,18 +18,16 @@
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
************************************************************************/
************************************************************************/
namespace Espo\Core\Entities;
class Person extends \Espo\Core\ORM\Entity
{
public static $person = true;
public function _setLastName($value)
{
$this->setValue('lastName', $value);
$firstName = $this->get('firstName');
if (empty($firstName)) {
$this->setValue('name', $value);
@@ -37,11 +35,11 @@ class Person extends \Espo\Core\ORM\Entity
$this->setValue('name', $firstName . ' ' . $value);
}
}
public function _setFirstName($value)
{
$this->setValue('firstName', $value);
$lastName = $this->get('lastName');
if (empty($lastName)) {
$this->setValue('name', $value);

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
@@ -29,33 +29,33 @@ use \Espo\Core\Exceptions\NotFound;
class ClientManager
{
protected $entityManager;
protected $metadata;
protected $clientMap = array();
public function __construct($entityManager, $metadata, $config)
{
$this->entityManager = $entityManager;
$this->metadata = $metadata;
$this->config = $config;
}
protected function getMetadata()
{
return $this->metadata;
}
protected function getEntityManager()
{
return $this->entityManager;
}
protected function getConfig()
{
return $this->config;
}
public function storeAccessToken($hash, $data)
{
if (!empty($this->clientMap[$hash]) && !empty($this->clientMap[$hash]['externalAccountEntity'])) {
@@ -64,37 +64,37 @@ class ClientManager
$externalAccountEntity->set('tokenType', $data['tokenType']);
$this->getEntityManager()->saveEntity($externalAccountEntity);
}
}
}
public function create($integration, $userId)
{
$authMethod = $this->getMetadata()->get("integrations.{$integration}.authMethod");
$methodName = 'create' . ucfirst($authMethod);
return $this->$methodName($integration, $userId);
$authMethod = $this->getMetadata()->get("integrations.{$integration}.authMethod");
$methodName = 'create' . ucfirst($authMethod);
return $this->$methodName($integration, $userId);
}
protected function createOAuth2($integration, $userId)
{
{
$integrationEntity = $this->getEntityManager()->getEntity('Integration', $integration);
$externalAccountEntity = $this->getEntityManager()->getEntity('ExternalAccount', $integration . '__' . $userId);
$className = $this->getMetadata()->get("integrations.{$integration}.clientClassName");
$redirectUri = $this->getConfig()->get('siteUrl') . '/oauthcallback'; // TODO move to client class
$redirectUri = $this->getConfig()->get('siteUrl') . '?entryPoint=oauthCallback'; // TODO move to client class
if (!$externalAccountEntity) {
throw new Error("External Account {$integration} not found for {$userId}");
}
if (!$integrationEntity->get('enabled')) {
return null;
}
}
if (!$externalAccountEntity->get('enabled')) {
return null;
}
$oauth2Client = new \Espo\Core\ExternalAccount\OAuth2\Client();
}
$oauth2Client = new \Espo\Core\ExternalAccount\OAuth2\Client();
$client = new $className($oauth2Client, array(
'endpoint' => $this->getMetadata()->get("integrations.{$integration}.params.endpoint"),
'tokenEndpoint' => $this->getMetadata()->get("integrations.{$integration}.params.tokenEndpoint"),
@@ -105,12 +105,12 @@ class ClientManager
'refreshToken' => $externalAccountEntity->get('refreshToken'),
'tokenType' => $externalAccountEntity->get('tokenType'),
), $this);
$this->addToClientMap($client, $integrationEntity, $externalAccountEntity, $userId);
return $client;
return $client;
}
protected function addToClientMap($client, $integrationEntity, $externalAccountEntity, $userId)
{
$this->clientMap[spl_object_hash($client)] = array(

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
@@ -29,9 +29,9 @@ use \Espo\Core\ExternalAccount\OAuth2\Client;
abstract class OAuth2Abstract implements IClient
{
protected $client = null;
protected $manager = null;
protected $paramList = array(
'endpoint',
'tokenEndpoint',
@@ -42,33 +42,33 @@ abstract class OAuth2Abstract implements IClient
'refreshToken',
'redirectUri',
);
protected $clientId = null;
protected $clientSecret = null;
protected $accessToken = null;
protected $refreshToken = null;
protected $redirectUri = null;
public function __construct($client, array $params = array(), $manager = null)
{
$this->client = $client;
$this->setParams($params);
$this->manager = $manager;
}
public function getParam($name)
{
if (in_array($name, $this->paramList)) {
return $this->$name;
}
}
public function setParam($name, $value)
{
if (in_array($name, $this->paramList)) {
@@ -79,7 +79,7 @@ abstract class OAuth2Abstract implements IClient
$this->$name = $value;
}
}
public function setParams(array $params)
{
foreach ($this->paramList as $name) {
@@ -88,42 +88,41 @@ abstract class OAuth2Abstract implements IClient
}
}
}
protected function afterTokenRefreshed($data)
{
if ($this->manager) {
$this->manager->storeAccessToken(spl_object_hash($this), $data);
}
}
public function getAccessTokenFromAuthorizationCode($code)
{
$r = $this->client->getAccessToken($this->getParam('tokenEndpoint'), Client::GRANT_TYPE_AUTHORIZATION_CODE, array(
'code' => $code,
'redirect_uri' => $this->getParam('redirectUri')
));
if ($r['code'] == 200) {
$data = array();
if (!empty($r['result'])) {
$data['accessToken'] = $r['result']['access_token'];
$data['tokenType'] = $r['result']['token_type'];
$data['refreshToken'] = $r['result']['refresh_token'];
$data['refreshToken'] = $r['result']['refresh_token'];
}
return $data;
}
return null;
}
abstract protected function getPingUrl();
public function ping()
{
if (empty($this->accessToken) || empty($this->clientId) || empty($this->clientSecret)) {
return false;
}
$url = $this->getPingUrl();
try {
@@ -133,35 +132,48 @@ abstract class OAuth2Abstract implements IClient
return false;
}
}
public function request($url, $params = array(), $httpMethod = Client::HTTP_METHOD_GET, $allowRenew = true)
public function request($url, $params = null, $httpMethod = Client::HTTP_METHOD_GET, $contentType = null, $allowRenew = true)
{
$r = $this->client->request($url, $params, $httpMethod);
$httpHeaders = array();
if (!empty($contentType)) {
$httpHeaders['Content-Type'] = $contentType;
switch ($contentType) {
case Client::CONTENT_TYPE_MULTIPART_FORM_DATA:
$httpHeaders['Content-Length'] = strlen($params);
break;
case Client::CONTENT_TYPE_APPLICATION_JSON:
$httpHeaders['Content-Length'] = strlen($params);
break;
}
}
$r = $this->client->request($url, $params, $httpMethod, $httpHeaders);
$code = null;
if (!empty($r['code'])) {
$code = $r['code'];
}
}
if ($code == 200) {
return $r['result'];
} else {
$handledData = $this->handleErrorResponse($r);
if ($allowRenew && is_array($handledData)) {
if ($handledData['action'] == 'refreshToken') {
if ($this->refreshToken()) {
return $this->request($url, $params, $httpMethod, false);
if ($this->refreshToken()) {
return $this->request($url, $params, $httpMethod, $contentType, false);
}
} else if ($handledData['action'] == 'renew') {
return $this->request($url, $params, $httpMethod, false);
return $this->request($url, $params, $httpMethod, $contentType, false);
}
}
}
throw new Error("Error after requesting {$httpMethod} {$url}.", $code);
}
protected function refreshToken()
{
if (!empty($this->refreshToken)) {
@@ -183,11 +195,11 @@ abstract class OAuth2Abstract implements IClient
}
}
}
protected function handleErrorResponse($r)
{
if ($r['code'] == 401 && !empty($r['result'])) {
$result = $r['result'];
$result = $r['result'];
if (strpos($r['header'], 'error=invalid_token') !== false) {
return array(
'action' => 'refreshToken'
@@ -198,7 +210,7 @@ abstract class OAuth2Abstract implements IClient
);
}
} else if ($r['code'] == 400 && !empty($r['result'])) {
if ($r['result']['error'] == 'invalid_token') {
if ($r['result']['error'] == 'invalid_token') {
return array(
'action' => 'refreshToken'
);

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
@@ -32,8 +32,9 @@ class Client
const TOKEN_TYPE_BEARER = 'Bearer';
const TOKEN_TYPE_OAUTH = 'OAuth';
const CONTENT_TYPE_APPLICATION = 0;
const CONTENT_TYPE_MULTIPART = 1;
const CONTENT_TYPE_APPLICATION_X_WWW_FORM_URLENENCODED = 'application/x-www-form-urlencoded';
const CONTENT_TYPE_MULTIPART_FORM_DATA = 'multipart/form-data';
const CONTENT_TYPE_APPLICATION_JSON = 'application/json';
const HTTP_METHOD_GET = 'GET';
const HTTP_METHOD_POST = 'POST';
@@ -118,7 +119,7 @@ class Client
$this->accessTokenSecret = $accessTokenSecret;
}
public function request($url, $params = array(), $httpMethod = self::HTTP_METHOD_GET, array $httpHeaders = array(), $contentType = self::CONTENT_TYPE_MULTIPART)
public function request($url, $params = null, $httpMethod = self::HTTP_METHOD_GET, array $httpHeaders = array())
{
if ($this->accessToken) {
switch ($this->tokenType) {
@@ -137,10 +138,10 @@ class Client
}
}
return $this->execute($url, $params, $httpMethod, $httpHeaders, $contentType);
return $this->execute($url, $params, $httpMethod, $httpHeaders);
}
private function execute($url, $params = array(), $httpMethod, array $httpHeaders = array(), $contentType = self::CONTENT_TYPE_MULTIPART)
private function execute($url, $params = null, $httpMethod, array $httpHeaders = array())
{
$curlOptions = array(
CURLOPT_RETURNTRANSFER => true,
@@ -153,8 +154,10 @@ class Client
$curlOptions[CURLOPT_POST] = true;
case self::HTTP_METHOD_PUT:
case self::HTTP_METHOD_PATCH:
if (self::CONTENT_TYPE_APPLICATION === $contentType) {
if (is_array($params)) {
$postFields = http_build_query($params, null, '&');
} else {
$postFields = $params;
}
$curlOptions[CURLOPT_POSTFIELDS] = $postFields;
break;
@@ -165,7 +168,9 @@ class Client
if (strpos($url, '?') === false) {
$url .= '?';
}
$url .= http_build_query($params, null, '&');
if (is_array($params)) {
$url .= http_build_query($params, null, '&');
}
break;
default:
break;
@@ -242,7 +247,7 @@ class Client
throw new \Exception();
}
return $this->execute($url, $params, self::HTTP_METHOD_POST, $httpHeaders, self::CONTENT_TYPE_APPLICATION);
return $this->execute($url, $params, self::HTTP_METHOD_POST, $httpHeaders);
}
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
@@ -73,7 +73,7 @@ class HookManager
protected function loadHooks()
{
if ($this->getConfig()->get('useCache') && file_exists($this->cacheFile)) {
$this->data = $this->getFileManager()->getContents($this->cacheFile);
$this->data = $this->getFileManager()->getPhpContents($this->cacheFile);
return;
}
@@ -83,13 +83,13 @@ class HookManager
foreach ($metadata->getModuleList() as $moduleName) {
$modulePath = str_replace('{*}', $moduleName, $this->paths['modulePath']);
$this->data = array_merge($this->data, $this->getHookData($modulePath));
$this->data = array_merge_recursive($this->data, $this->getHookData($modulePath));
}
$this->data = array_merge($this->data, $this->getHookData($this->paths['customPath']));
$this->data = array_merge_recursive($this->data, $this->getHookData($this->paths['customPath']));
if ($this->getConfig()->get('useCache')) {
$this->getFileManager()->putContentsPHP($this->cacheFile, $this->data);
$this->getFileManager()->putPhpContents($this->cacheFile, $this->data);
}
}
@@ -170,7 +170,9 @@ class HookManager
$sortedHookList = array_merge($sortedHookList, $hookDetails);
}
$hooks[$scopeName][$hookName] = isset($hooks[$scopeName][$hookName]) ? array_merge($hooks[$scopeName][$hookName], $sortedHookList) : $sortedHookList;
$normalizedScopeName = Util::normilizeScopeName($scopeName);
$hooks[$normalizedScopeName][$hookName] = isset($hooks[$normalizedScopeName][$hookName]) ? array_merge($hooks[$normalizedScopeName][$hookName], $sortedHookList) : $sortedHookList;
}
}
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
@@ -24,7 +24,6 @@ namespace Espo\Core\Jobs;
use \Espo\Core\Container;
abstract class Base
{
private $container;

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
@@ -36,6 +36,8 @@ class EntityManager extends Base
'password' => $config->get('database.password'),
'metadata' => $this->getContainer()->get('metadata')->getOrmMetadata(),
'repositoryFactoryClassName' => '\\Espo\\Core\\ORM\\RepositoryFactory',
'driver' => $config->get('database.driver'),
'platform' => $config->get('database.platform')
);
$entityManager = new \Espo\Core\ORM\EntityManager($params);

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
@@ -22,31 +22,17 @@
namespace Espo\Core\Loaders;
use Espo\Core\Utils,
Espo\Core\Utils\Log\Monolog\Handler;
class Log extends Base
class EntityManagerUtil extends Base
{
public function load()
{
$logConfig = $this->getContainer()->get('config')->get('logger');
$entityManager = new \Espo\Core\Utils\EntityManager(
$this->getContainer()->get('metadata'),
$this->getContainer()->get('language'),
$this->getContainer()->get('fileManager')
);
$log = new Utils\Log('Espo');
$levelCode = $log->getLevelCode($logConfig['level']);
if ($logConfig['isRotate']) {
$handler = new Handler\RotatingFileHandler($logConfig['path'], $logConfig['maxRotateFiles'], $levelCode);
} else {
$handler = new Handler\StreamHandler($logConfig['path'], $levelCode);
}
$log->pushHandler($handler);
$errorHandler = new \Monolog\ErrorHandler($log);
$errorHandler->registerExceptionHandler(null, false);
$errorHandler->registerErrorHandler(array(), false);
return $log;
return $entityManager;
}
}

View File

@@ -1,92 +1,119 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
************************************************************************/
namespace Espo\Core\Mail;
use \Zend\Mime\Mime as Mime;
class Importer
{
{
private $entityManager;
private $fileManager;
public function __construct($entityManager, $fileManager)
private $config;
public function __construct($entityManager, $fileManager, $config)
{
$this->entityManager = $entityManager;
$this->fileManager = $fileManager;
$this->config = $config;
}
protected function getEntityManager()
{
return $this->entityManager;
}
protected function getConfig()
{
return $this->config;
}
protected function getFileManager()
{
return $this->fileManager;
}
public function importMessage($message, $userId, $teamsIds = array())
{
try {
$email = $this->getEntityManager()->getEntity('Email');
$subject = $message->subject;
if ($subject !== '0' && empty($subject)) {
$subject = '--empty--';
}
$email->set('isHtml', false);
$email->set('isHtml', false);
$email->set('name', $subject);
$email->set('status', 'Archived');
$email->set('attachmentsIds', array());
$email->set('attachmentsIds', array());
$email->set('assignedUserId', $userId);
$email->set('teamsIds', $teamsIds);
$fromArr = $this->getAddressListFromMessage($message, 'from');
$fromArr = $this->getAddressListFromMessage($message, 'from');
if (isset($message->from)) {
$email->set('fromName', $message->from);
}
}
$email->set('from', $fromArr[0]);
$email->set('to', implode(';', $this->getAddressListFromMessage($message, 'to')));
$email->set('to', implode(';', $this->getAddressListFromMessage($message, 'to')));
$email->set('cc', implode(';', $this->getAddressListFromMessage($message, 'cc')));
if (isset($message->messageId) && !empty($message->messageId)) {
if (isset($message->messageId) && !empty($message->messageId)) {
$email->set('messageId', $message->messageId);
if (isset($message->deliveredTo)) {
$email->set('messageIdInternal', $message->messageId . '-' . $message->deliveredTo);
}
}
if ($this->checkIsDuplicate($email)) {
return false;
}
}
if (isset($message->date)) {
$dt = new \DateTime($message->date);
if ($dt) {
$dateSent = $dt->setTimezone(new \DateTimeZone('UTC'))->format('Y-m-d H:i:s');
$dateSent = $dt->setTimezone(new \DateTimeZone('UTC'))->format('Y-m-d H:i:s');
$email->set('dateSent', $dateSent);
}
}
if (isset($message->deliveryDate)) {
$dt = new \DateTime($message->deliveryDate);
if ($dt) {
$deliveryDate = $dt->setTimezone(new \DateTimeZone('UTC'))->format('Y-m-d H:i:s');
$deliveryDate = $dt->setTimezone(new \DateTimeZone('UTC'))->format('Y-m-d H:i:s');
$email->set('deliveryDate', $deliveryDate);
}
}
$inlineIds = array();
if ($message->isMultipart()) {
if ($message->isMultipart()) {
foreach (new \RecursiveIteratorIterator($message) as $part) {
$this->importPartDataToEmail($email, $part, $inlineIds);
}
}
} else {
$this->importPartDataToEmail($email, $message, $inlineIds);
}
$body = $email->get('body');
if (!empty($body)) {
foreach ($inlineIds as $cid => $attachmentId) {
@@ -95,13 +122,46 @@ class Importer
$email->set('body', $body);
}
if (isset($message->references) && !empty($message->references)) {
$reference = str_replace(array('/', '@'), " ", trim($message->references, '<>'));
$parentType = $parentId = null;
$emailSent = PHP_INT_MAX;
$n = sscanf($reference, '%s %s %d %d espo', $parentType, $parentId, $emailSent, $number);
if ($n == 4 && $emailSent < time()) {
if (!empty($parentType) && !empty($parentId)) {
$email->set('parentType', $parentType);
$email->set('parentId', $parentId);
}
}
}
if (!$email->has('parentId')) {
$from = $email->get('from');
if ($from) {
$contact = $this->getEntityManager()->getRepository('Contact')->where(array(
'emailAddress' => $from
))->findOne();
if ($contact) {
if (!$this->getConfig()->get('b2cMode')) {
if ($contact->get('accountId')) {
$email->set('parentType', 'Account');
$email->set('parentId', $contact->get('accountId'));
}
} else {
$email->set('parentType', 'Contact');
$email->set('parentId', $contact->id);
}
}
}
}
$this->getEntityManager()->saveEntity($email);
return $email;
} catch (\Exception $e) {}
}
protected function checkIsDuplicate($email)
{
if ($email->get('messageIdInternal')) {
@@ -113,12 +173,12 @@ class Importer
}
}
}
protected function getAddressListFromMessage($message, $type)
{
$addressList = array();
if (isset($message->$type)) {
$list = $message->getHeader($type)->getAddressList();
foreach ($list as $address) {
$addressList[] = $address->getEmail();
@@ -126,82 +186,97 @@ class Importer
}
return $addressList;
}
protected function importPartDataToEmail(\Espo\Entities\Email $email, $part, &$inlineIds = array())
{
{
try {
if (!$part->getHeaders() || !isset($part->contentType)) {
return;
}
$type = strtok($part->contentType, ';');
$encoding = null;
switch ($type) {
case 'text/plain':
$content = $this->getContentFromPart($part);
if (!$email->get('body')) {
$email->set('body', $content);
}
$email->set('bodyPlain', $content);
break;
case 'text/html':
$content = $this->getContentFromPart($part);
$email->set('body', $content);
$email->set('isHtml', true);
break;
default:
$content = $part->getContent();
$disposition = null;
$fileName = null;
$contentId = null;
if (isset($part->ContentDisposition)) {
if (strpos($part->ContentDisposition, 'attachment') === 0) {
if (preg_match('/filename="?([^"]+)"?/i', $part->ContentDisposition, $m)) {
$fileName = $m[1];
$disposition = 'attachment';
}
} else if (strpos($part->ContentDisposition, 'inline') === 0) {
$contentId = trim($part->contentID, '<>');
$fileName = $contentId;
$disposition = 'inline';
}
}
if (isset($part->contentTransferEncoding)) {
$encoding = strtolower($part->getHeader('Content-Transfer-Encoding')->getTransferEncoding());
}
$attachment = $this->getEntityManager()->getEntity('Attachment');
$attachment->set('name', $fileName);
$attachment->set('type', $type);
if ($disposition == 'inline') {
$attachment->set('role', 'Inline Attachment');
$isAttachment = true;
if ($type == 'text/plain' || $type == 'text/html') {
$isAttachment = false;
$content = $this->getContentFromPart($part);
if ($type == 'text/plain') {
if ($email->get('bodyPlain')) {
$isAttachment = true;
} else {
$attachment->set('role', 'Attachment');
$email->set('bodyPlain', $content);
if (!$email->get('body')) {
$email->set('body', $content);
}
}
if ($encoding == 'base64') {
$content = base64_decode($content);
} else if ($type == 'text/html') {
if ($email->get('isHtml')) {
$isAttachment = true;
} else {
$email->set('body', $content);
$email->set('isHtml', true);
}
$attachment->set('size', strlen($content));
$this->getEntityManager()->saveEntity($attachment);
$path = 'data/upload/' . $attachment->id;
$this->getFileManager()->putContents($path, $content);
if ($disposition == 'attachment') {
$attachmentsIds = $email->get('attachmentsIds');
$attachmentsIds[] = $attachment->id;
$email->set('attachmentsIds', $attachmentsIds);
} else if ($disposition == 'inline') {
$inlineIds[$contentId] = $attachment->id;
}
}
}
} catch (\Exception $e) {}
if ($isAttachment) {
$content = $part->getContent();
$disposition = null;
$fileName = null;
$contentId = null;
if (isset($part->ContentDisposition)) {
if (strpos($part->ContentDisposition, 'attachment') === 0) {
if (preg_match('/filename="?([^"]+)"?/i', $part->ContentDisposition, $m)) {
$fileName = $m[1];
$disposition = 'attachment';
}
} else if (strpos($part->ContentDisposition, 'inline') === 0) {
$contentId = trim($part->contentID, '<>');
$fileName = $contentId;
$disposition = 'inline';
}
}
if (isset($part->contentTransferEncoding)) {
$encoding = strtolower($part->getHeader('Content-Transfer-Encoding')->getTransferEncoding());
}
$attachment = $this->getEntityManager()->getEntity('Attachment');
$attachment->set('name', $fileName);
$attachment->set('type', $type);
if ($disposition == 'inline') {
$attachment->set('role', 'Inline Attachment');
} else {
$attachment->set('role', 'Attachment');
}
if ($encoding == 'base64') {
$content = base64_decode($content);
}
$attachment->set('size', strlen($content));
$this->getEntityManager()->saveEntity($attachment);
$path = 'data/upload/' . $attachment->id;
$this->getFileManager()->putContents($path, $content);
if ($disposition == 'attachment') {
$attachmentsIds = $email->get('attachmentsIds');
$attachmentsIds[] = $attachment->id;
$email->set('attachmentsIds', $attachmentsIds);
} else if ($disposition == 'inline') {
$inlineIds[$contentId] = $attachment->id;
}
}
} catch (\Exception $e) {}
}
protected function getContentFromPart($part)
{
if ($part instanceof \Zend\Mime\Part) {
@@ -211,20 +286,20 @@ class Importer
}
} else {
$content = $part->getContent();
$encoding = null;
if (isset($part->contentTransferEncoding)) {
$cteHeader = $part->getHeader('Content-Transfer-Encoding');
$encoding = strtolower($cteHeader->getTransferEncoding());
}
if ($encoding == 'base64') {
$content = base64_decode($content);
}
$charset = 'UTF-8';
$charset = 'UTF-8';
if (isset($part->contentType)) {
$ctHeader = $part->getHeader('Content-Type');
$charsetParamValue = $ctHeader->getParameter('charset');
@@ -232,17 +307,17 @@ class Importer
$charset = strtoupper($charsetParamValue);
}
}
if ($charset !== 'UTF-8') {
$content = mb_convert_encoding($content, 'UTF-8', $charset);
}
if (isset($part->contentTransferEncoding)) {
$cteHeader = $part->getHeader('Content-Transfer-Encoding');
if ($cteHeader->getTransferEncoding() == 'quoted-printable') {
$cteHeader = $part->getHeader('Content-Transfer-Encoding');
if ($cteHeader->getTransferEncoding() == 'quoted-printable') {
$content = quoted_printable_decode($content);
}
}
}
if ($charset !== 'UTF-8') {
$content = mb_convert_encoding($content, 'UTF-8', $charset);
}
}
return $content;
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify

View File

@@ -1,19 +1,41 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
************************************************************************/
namespace Espo\Core\Mail\Storage;
class Imap extends \Zend\Mail\Storage\Imap
{
{
protected $messageClass = '\\Espo\\Core\\Mail\\Storage\\Message';
public function getIdsFromUID($uid)
{
$uid = intval($uid) + 1;
return $this->protocol->search(array('UID ' . $uid . ':*'));
}
public function getIdsFromDate($date)
{
{
return $this->protocol->search(array('SINCE "' . $date . '"'));
}
}

View File

@@ -0,0 +1,40 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
************************************************************************/
namespace Espo\Core\Mail\Storage;
class Message extends \Zend\Mail\Storage\Message
{
public function isMultipart()
{
if (!isset($this->contentType)) {
return false;
}
try {
return stripos($this->contentType, 'multipart/') === 0;
} catch (Exception\ExceptionInterface $e) {
return false;
}
}
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
@@ -32,14 +32,14 @@ use \Espo\Core\Interfaces\Injectable;
class RDB extends \Espo\ORM\Repositories\RDB implements Injectable
{
public static $mapperClassName = '\\Espo\\Core\\ORM\\DB\\MysqlMapper';
protected $dependencies = array(
'metadata'
);
protected $injections = array();
private $restoreData = null;
public function inject($name, $object)
{
$this->injections[$name] = $object;
@@ -141,6 +141,14 @@ class RDB extends \Espo\ORM\Repositories\RDB implements Injectable
{
parent::beforeRemove($entity);
$this->getEntityManager()->getHookManager()->process($this->entityName, 'beforeRemove', $entity);
$nowString = date('Y-m-d H:i:s', time());
if ($entity->hasField('modifiedAt')) {
$entity->set('modifiedAt', $nowString);
}
if ($entity->hasField('modifiedById')) {
$entity->set('modifiedById', $this->getEntityManager()->getUser()->id);
}
}
protected function afterRemove(Entity $entity)
@@ -163,12 +171,22 @@ class RDB extends \Espo\ORM\Repositories\RDB implements Injectable
protected function beforeSave(Entity $entity)
{
parent::beforeSave($entity);
$this->getEntityManager()->getHookManager()->process($this->entityName, 'beforeSave', $entity);
}
protected function afterSave(Entity $entity)
{
if (!empty($this->restoreData)) {
$entity->set($this->restoreData);
$this->restoreData = null;
}
parent::afterSave($entity);
$this->handleEmailAddressSave($entity);
$this->handlePhoneNumberSave($entity);
$this->handleSpecifiedRelations($entity);
$this->getEntityManager()->getHookManager()->process($this->entityName, 'afterSave', $entity);
}
@@ -216,14 +234,10 @@ class RDB extends \Espo\ORM\Repositories\RDB implements Injectable
$entity->clear('createdById');
$entity->clear('createdAt');
}
$this->restoreData = $restoreData;
$result = parent::save($entity);
$entity->set($restoreData);
$this->handleEmailAddressSave($entity);
$this->handlePhoneNumberSave($entity);
$this->handleSpecifiedRelations($entity);
return $result;
}
@@ -247,8 +261,18 @@ class RDB extends \Espo\ORM\Repositories\RDB implements Injectable
foreach ($entity->getRelations() as $name => $defs) {
if (in_array($defs['type'], $relationTypes)) {
$fieldName = $name . 'Ids';
if ($entity->has($fieldName)) {
$specifiedIds = $entity->get($fieldName);
$columnsFieldsName = $name . 'Columns';
if ($entity->has($fieldName) || $entity->has($columnsFieldsName)) {
if ($entity->has($fieldName)) {
$specifiedIds = $entity->get($fieldName);
} else {
$specifiedIds = array();
foreach ($entity->get($columnsFieldsName) as $id => $d) {
$specifiedIds[] = $id;
}
}
if (is_array($specifiedIds)) {
$toRemoveIds = array();
$existingIds = array();
@@ -258,9 +282,8 @@ class RDB extends \Espo\ORM\Repositories\RDB implements Injectable
$defs = array();
$columns = $this->getMetadata()->get("entityDefs." . $entity->getEntityName() . ".fields.{$name}.columns");
if (!empty($columns)) {
$columnData = $entity->get($name . 'Columns');
$columnData = $entity->get($columnsFieldsName);
$defs['additionalColumns'] = $columns;
}
foreach ($entity->get($name, $defs) as $foreignEntity) {
@@ -272,9 +295,18 @@ class RDB extends \Espo\ORM\Repositories\RDB implements Injectable
$data->$columnName = $foreignEntity->get($columnField);
}
$existingColumnsData->$foreignId = $data;
$entity->setFetched($columnsFieldsName, $existingColumnsData);
}
}
if ($entity->has($fieldName)) {
$entity->setFetched($fieldName, $existingIds);
}
if ($entity->has($columnsFieldsName) && !empty($columns)) {
$entity->setFetched($columnsFieldsName, $existingColumnsData);
}
foreach ($existingIds as $id) {
if (!in_array($id, $specifiedIds)) {
$toRemoveIds[] = $id;

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
@@ -18,7 +18,7 @@
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
************************************************************************/
************************************************************************/
namespace Espo\Core;
@@ -29,11 +29,11 @@ use \Espo\Core\Utils\Util;
class SelectManagerFactory
{
private $entityManager;
private $user;
private $acl;
private $metadata;
public function __construct($entityManager, \Espo\Entities\User $user, Acl $acl, $metadata)
@@ -43,26 +43,28 @@ class SelectManagerFactory
$this->acl = $acl;
$this->metadata = $metadata;
}
public function create($entityName)
{
$className = '\\Espo\\Custom\\SelectManagers\\' . Util::normilizeClassName($entityName);
$normalizedName = Util::normilizeClassName($entityName);
$className = '\\Espo\\Custom\\SelectManagers\\' . $normalizedName;
if (!class_exists($className)) {
$moduleName = $this->metadata->getScopeModuleName($entityName);
if ($moduleName) {
$className = '\\Espo\\Modules\\' . $moduleName . '\\SelectManagers\\' . Util::normilizeClassName($entityName);
$className = '\\Espo\\Modules\\' . $moduleName . '\\SelectManagers\\' . $normalizedName;
} else {
$className = '\\Espo\\SelectManagers\\' . Util::normilizeClassName($entityName);
}
$className = '\\Espo\\SelectManagers\\' . $normalizedName;
}
if (!class_exists($className)) {
$className = '\\Espo\\Core\\SelectManagers\\Base';
}
}
$selectManager = new $className($this->entityManager, $this->user, $this->acl, $this->metadata);
$selectManager->setEntityName($entityName);
return $selectManager;
}
}
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
@@ -40,6 +40,8 @@ class Base
protected $metadata;
private $seed = null;
const MIN_LENGTH_FOR_CONTENT_SEARCH = 4;
public function __construct($entityManager, \Espo\Entities\User $user, Acl $acl, $metadata)
@@ -47,9 +49,20 @@ class Base
$this->entityManager = $entityManager;
$this->user = $user;
$this->acl = $acl;
$this->metadata = $metadata;
}
protected function getEntityManager()
{
return $this->entityManager;
}
protected function getUser()
{
return $this->user;
}
public function setEntityName($entityName)
{
$this->entityName = $entityName;
@@ -90,6 +103,36 @@ class Base
return $this->metadata->get("entityDefs.{$this->entityName}.collection.textFilterFields", array('name'));
}
protected function getSeed()
{
if (empty($this->seed)) {
$this->seed = $this->entityManager->getEntity($this->entityName);
}
return $this->seed;
}
protected function textFilter($value, &$result)
{
$fieldDefs = $this->getSeed()->getFields();
$fieldList = $this->getTextFilterFields();
$d = array();
foreach ($fieldList as $field) {
if (
strlen($item['value']) >= self::MIN_LENGTH_FOR_CONTENT_SEARCH
&&
!empty($fieldDefs[$field]['type']) && $fieldDefs[$field]['type'] == 'text'
) {
$d[$field . '*'] = '%' . $value . '%';
} else {
$d[$field . '*'] = $value . '%';
}
}
$result['whereClause'][] = array(
'OR' => $d
);
}
protected function where($params, &$result)
{
if (!empty($params['where']) && is_array($params['where'])) {
@@ -102,34 +145,18 @@ class Base
if (!empty($p)) {
$params['where'][] = $p;
}
$this->boolFilter($filter, $result);
}
} else if ($item['type'] == 'textFilter' && !empty($item['value'])) {
if (!empty($item['value'])) {
if (empty($result['whereClause'])) {
$result['whereClause'] = array();
}
$fieldDefs = $this->entityManager->getEntity($this->entityName)->getFields();
$fieldList = $this->getTextFilterFields();
$d = array();
foreach ($fieldList as $field) {
if (
strlen($item['value']) >= self::MIN_LENGTH_FOR_CONTENT_SEARCH
&&
!empty($fieldDefs[$field]['type']) && $fieldDefs[$field]['type'] == 'text'
) {
$d[$field . '*'] = '%' . $item['value'] . '%';
} else {
$d[$field . '*'] = $item['value'] . '%';
}
}
$where['OR'] = $d;
$this->textFilter($item['value'], $result);
}
}
}
$linkedWith = array();
$ignoreList = array('linkedWith', 'boolFilters');
foreach ($params['where'] as $item) {
foreach ($params['where'] as $item) {
if (!in_array($item['type'], $ignoreList)) {
$part = $this->getWherePart($item);
if (!empty($part)) {
@@ -146,13 +173,28 @@ class Base
$joins = array();
$part = array();
foreach ($linkedWith as $link => $ids) {
$joins[] = $link;
$defs = $this->entityManager->getMetadata()->get($this->entityName);
foreach ($linkedWith as $link => $idsValue) {
if (is_array($idsValue) && count($idsValue) == 1) {
$idsValue = $idsValue[0];
}
$entityName = $defs['relations'][$link]['entity'];
if ($entityName) {
$part[$entityName . '.id'] = $ids;
$relDefs = $this->getSeed()->getRelations();
if (!empty($relDefs[$link])) {
$defs = $relDefs[$link];
if ($defs['type'] == 'manyMany') {
$joins[] = $link;
if (!empty($defs['relationName']) && !empty($defs['midKeys'])) {
$key = $defs['midKeys'][1];
$relationName = $defs['relationName'];
$part[$relationName . '.' . $key] = $idsValue;
}
} else if ($defs['type'] == 'belongsTo') {
if (!empty($defs['type']['key'])) {
$key = $defs['type']['key'];
$part[$key] = $idsValue;
}
}
}
}
@@ -164,18 +206,14 @@ class Base
}
$result['whereClause'] = $where;
$result['whereClause'] = array_merge($result['whereClause'], $where);
}
}
protected function q($params, &$result)
{
if (!empty($params['q'])) {
if (empty($result['whereClause'])) {
$result['whereClause'] = array();
}
$fieldDefs = $this->entityManager->getEntity($this->entityName)->getFields();
$fieldDefs = $this->getSeed()->getFields();
$value = $params['q'];
@@ -193,39 +231,49 @@ class Base
}
}
$result['whereClause']['OR'] = $d;
$result['whereClause'][] = array(
'OR' => $d
);
}
}
protected function access(&$result)
{
if ($this->acl->checkReadOnlyOwn($this->entityName)) {
if (!array_key_exists('whereClause', $result)) {
$result['whereClause'] = array();
}
$result['whereClause']['assignedUserId'] = $this->user->id;
$this->accessOnlyOwn($result);
}
if (!$this->user->isAdmin() && $this->acl->checkReadOnlyTeam($this->entityName)) {
if (!array_key_exists('whereClause', $result)) {
$result['whereClause'] = array();
}
$result['distinct'] = true;
if (!array_key_exists('joins', $result)) {
$result['joins'] = array();
}
if (!in_array('teams', $result['joins'])) {
$result['leftJoins'][] = 'teams';
}
$result['whereClause']['OR'] = array(
'Team.id' => $this->user->get('teamsIds'),
'assignedUserId' => $this->user->id
);
//$result['whereClause']['Team.id'] = $this->user->get('teamsIds');
$this->accessOnlyTeam($result);
}
}
protected function accessOnlyOwn(&$result)
{
if (!$this->getSeed()->hasField('assignedUserId')) {
return;
}
$result['whereClause'][] = array(
'assignedUserId' => $this->getUser()->id
);
}
protected function accessOnlyTeam(&$result)
{
if (!$this->getSeed()->hasField('teamsIds')) {
return;
}
$result['distinct'] = true;
if (!in_array('teams', $result['joins'])) {
$result['leftJoins'][] = 'teams';
}
$result['whereClause'][] = array(
'OR' => array(
'Team.id' => $this->user->get('teamsIds'),
'assignedUserId' => $this->getUser()->id
)
);
}
public function getAclParams()
{
$result = array();
@@ -235,7 +283,11 @@ class Base
public function getSelectParams(array $params, $withAcl = false)
{
$result = array();
$result = array(
'joins' => array(),
'leftJoins' => array(),
'whereClause' => array()
);
$this->order($params, $result);
$this->limit($params, $result);
@@ -263,7 +315,7 @@ class Base
$a = $this->getWherePart($i);
foreach ($a as $left => $right) {
if (!empty($right)) {
$arr[$left] = $right;
$arr[] = array($left => $right);
}
}
}
@@ -381,6 +433,14 @@ class Base
return $part;
}
protected function boolFilter($filterName, &$result)
{
$method = 'boolFilter' . ucfirst($filterName);
if (method_exists($this, $method)) {
$this->$method($result);
}
}
protected function getBoolFilterWhere($filterName)
{
$method = 'getBoolFilterWhere' . ucfirst($filterName);
@@ -389,12 +449,10 @@ class Base
}
}
protected function getBoolFilterWhereOnlyMy()
protected function boolFilterOnlyMy(&$result)
{
return array(
'type' => 'equals',
'field' => 'assignedUserId',
'value' => $this->user->id,
$result['whereClause'][] = array(
'assignedUserId' => $this->getUser()->id
);
}
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
@@ -48,31 +48,6 @@ class ServiceFactory
$this->container = $container;
}
protected function init()
{
$config = $this->getContainer()->get('config');
if (file_exists($this->cacheFile) && $config->get('useCache')) {
$this->data = $this->getFileManager()->getContents($this->cacheFile);
} else {
$this->data = $this->getClassNameHash($this->paths['corePath']);
foreach ($this->getContainer()->get('metadata')->getModuleList() as $moduleName) {
$path = str_replace('{*}', $moduleName, $this->paths['modulePath']);
$this->data = array_merge($this->data, $this->getClassNameHash($path));
}
$this->data = array_merge($this->data, $this->getClassNameHash($this->paths['customPath']));
if ($config->get('useCache')) {
$result = $this->getFileManager()->putContentsPHP($this->cacheFile, $this->data);
if ($result == false) {
throw new \Espo\Core\Exceptions\Error();
}
}
}
}
protected function getFileManager()
{
return $this->container->get('fileManager');
@@ -83,15 +58,19 @@ class ServiceFactory
return $this->container;
}
protected function init()
{
$classParser = $this->getContainer()->get('classParser');
$classParser->setAllowedMethods(null);
$this->data = $classParser->getData($this->paths, $this->cacheFile);
}
protected function getClassName($name)
{
$name = Util::normilizeClassName($name);
if (!isset($this->data)) {
$this->init();
}
$name = ucfirst($name);
if (isset($this->data[$name])) {
return $this->data[$name];
}
@@ -127,28 +106,5 @@ class ServiceFactory
}
throw new Error("Class '$className' does not exist");
}
// TODO delegate to another class
protected function getClassNameHash($dirs)
{
if (is_string($dirs)) {
$dirs = (array) $dirs;
}
$data = array();
foreach ($dirs as $dir) {
if (file_exists($dir)) {
$fileList = $this->getFileManager()->getFileList($dir, false, '\.php$', true);
foreach ($fileList as $file) {
$filePath = Util::concatPath($dir, $file);
$className = Util::getClassName($filePath);
$fileName = $this->getFileManager()->getFileName($filePath);
$data[$fileName] = $className;
}
}
}
return $data;
}
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
@@ -20,10 +20,11 @@
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
************************************************************************/
namespace Espo\Core\ORM\DB;
namespace Espo\Core\Templates\Controllers;
class MysqlMapper extends \Espo\ORM\DB\MysqlMapper
class Base extends \Espo\Core\Controllers\Record
{
protected $returnCollection = false;
}

View File

@@ -0,0 +1,30 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
************************************************************************/
namespace Espo\Core\Templates\Controllers;
class Person extends \Espo\Core\Controllers\Record
{
}

View File

@@ -0,0 +1,29 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
************************************************************************/
namespace Espo\Core\Templates\Entities;
class Base extends \Espo\Core\ORM\Entity
{
}

View File

@@ -0,0 +1,29 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
************************************************************************/
namespace Espo\Core\Templates\Entities;
class Person extends \Espo\Core\Entities\Person
{
}

View File

@@ -0,0 +1,4 @@
{
"controller": "Controllers.Record",
"boolFilters": ["onlyMy"]
}

View File

@@ -0,0 +1,65 @@
{
"fields": {
"name": {
"type": "varchar",
"required": true
},
"description": {
"type": "text"
},
"createdAt": {
"type": "datetime",
"readOnly": true
},
"modifiedAt": {
"type": "datetime",
"readOnly": true
},
"createdBy": {
"type": "link",
"readOnly": true
},
"modifiedBy": {
"type": "link",
"readOnly": true
},
"assignedUser": {
"type": "link",
"required": true
},
"teams": {
"type": "linkMultiple"
}
},
"links": {
"createdBy": {
"type": "belongsTo",
"entity": "User"
},
"modifiedBy": {
"type": "belongsTo",
"entity": "User"
},
"assignedUser": {
"type": "belongsTo",
"entity": "User"
},
"teams": {
"type": "hasMany",
"entity": "Team",
"relationName": "EntityTeam"
}
},
"collection": {
"sortBy": "createdAt",
"asc": false
},
"indexes": {
"name": {
"columns": ["name", "deleted"]
},
"assignedUser": {
"columns": ["assignedUserId", "deleted"]
}
}
}

View File

@@ -0,0 +1,4 @@
{
"controller": "Controllers.Record",
"boolFilters": ["onlyMy"]
}

View File

@@ -0,0 +1,110 @@
{
"fields": {
"name": {
"type": "personName"
},
"salutationName": {
"type": "enum",
"options": ["", "Mr.", "Mrs.", "Dr."]
},
"firstName": {
"type": "varchar",
"maxLength": 100,
"default": ""
},
"lastName": {
"type": "varchar",
"maxLength": 100,
"required": true,
"default": ""
},
"description": {
"type": "text"
},
"createdAt": {
"type": "datetime",
"readOnly": true
},
"emailAddress": {
"type": "email"
},
"phoneNumber": {
"type": "phone",
"typeList": ["Mobile", "Office", "Home", "Fax", "Other"],
"defaultType": "Mobile"
},
"address": {
"type": "address"
},
"addressStreet": {
"type": "text",
"maxLength": 255,
"dbType": "varchar"
},
"addressCity": {
"type": "varchar"
},
"addressState": {
"type": "varchar"
},
"addressCountry": {
"type": "varchar"
},
"addressPostalCode": {
"type": "varchar"
},
"modifiedAt": {
"type": "datetime",
"readOnly": true
},
"createdBy": {
"type": "link",
"readOnly": true
},
"modifiedBy": {
"type": "link",
"readOnly": true
},
"assignedUser": {
"type": "link",
"required": true
},
"teams": {
"type": "linkMultiple"
}
},
"links": {
"createdBy": {
"type": "belongsTo",
"entity": "User"
},
"modifiedBy": {
"type": "belongsTo",
"entity": "User"
},
"assignedUser": {
"type": "belongsTo",
"entity": "User"
},
"teams": {
"type": "hasMany",
"entity": "Team",
"relationName": "EntityTeam"
}
},
"collection": {
"sortBy": "createdAt",
"asc": false
},
"indexes": {
"firstName": {
"columns": ["firstName", "deleted"]
},
"name": {
"columns": ["firstName", "lastName"]
},
"assignedUser": {
"columns": ["assignedUserId", "deleted"]
}
}
}

View File

@@ -0,0 +1,30 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
************************************************************************/
namespace Espo\Core\Templates\Repositories;
class Base extends \Espo\Core\ORM\Repositories\RDB
{
}

View File

@@ -0,0 +1,30 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
************************************************************************/
namespace Espo\Core\Templates\Repositories;
class Person extends \Espo\Core\ORM\Repositories\RDB
{
}

View File

@@ -0,0 +1,30 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
************************************************************************/
namespace Espo\Core\Templates\Services;
class Base extends \Espo\Services\Record
{
}

View File

@@ -0,0 +1,30 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
************************************************************************/
namespace Espo\Core\Templates\Services;
class Person extends \Espo\Services\Record
{
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
@@ -22,9 +22,11 @@
namespace Espo\Core\Upgrades\Actions;
use Espo\Core\Utils\Util,
Espo\Core\Utils\Json,
Espo\Core\Exceptions\Error;
use Espo\Core\Utils\Util;
use Espo\Core\Utils\System;
use Espo\Core\Utils\Json;
use Espo\Core\Exceptions\Error;
use vierbergenlars\SemVer;
abstract class Base
{
@@ -179,46 +181,55 @@ abstract class Base
*/
protected function isAcceptable()
{
$manifest = $this->getManifest();
$res = $this->checkPackageType();
$res &= $this->checkVersions();
//check php version
if (isset($manifest['php'])) {
$res &= $this->checkVersions($manifest['php'], System::getPhpVersion(), 'Your PHP version does not support this installation package.');
}
//check acceptableVersions
if (isset($manifest['acceptableVersions'])) {
$res &= $this->checkVersions($manifest['acceptableVersions'], $this->getConfig()->get('version'), 'Your EspoCRM version doesn\'t match for this installation package.');
}
return (bool) $res;
}
protected function checkVersions()
protected function checkVersions($versionList, $currentVersion, $errorMessage = '')
{
$manifest = $this->getManifest();
/** check acceptable versions */
$version = $manifest['acceptableVersions'];
if (empty($version)) {
if (empty($versionList)) {
return true;
}
$currentVersion = $this->getConfig()->get('version');
if (is_string($version)) {
$version = (array) $version;
if (is_string($versionList)) {
$versionList = (array) $versionList;
}
foreach ($version as $strVersion) {
try {
$semver = new SemVer\version($currentVersion);
} catch (\Exception $e) {
$GLOBALS['log']->error('Cannot recognize currentVersion ['.$currentVersion.'], error: '.$e->getMessage().'.');
return;
}
$strVersion = trim($strVersion);
foreach ($versionList as $version) {
if ($strVersion == $currentVersion) {
return true;
$isInRange = false;
try {
$isInRange = $semver->satisfies(new SemVer\expression($version));
} catch (\Exception $e) {
$GLOBALS['log']->error('Version identification error: '.$e->getMessage().'.');
}
$strVersion = str_replace('\\', '', $strVersion);
$strVersion = preg_quote($strVersion);
$strVersion = str_replace('\\*', '+', $strVersion);
if (preg_match('/^'.$strVersion.'/', $currentVersion)) {
if ($isInRange) {
return true;
}
}
$this->throwErrorAndRemovePackage('Your EspoCRM version doesn\'t match for this installation package.');
$this->throwErrorAndRemovePackage($errorMessage);
}
protected function checkPackageType()
@@ -491,5 +502,8 @@ abstract class Base
}
}
protected function clearCache()
{
return $this->getContainer()->get('dataManager')->clearCache();
}
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
@@ -83,6 +83,8 @@ class Install extends \Espo\Core\Upgrades\Actions\Base
$this->afterRunAction();
$this->clearCache();
/* delete unziped files */
$this->deletePackageFiles();

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
@@ -65,6 +65,8 @@ class Uninstall extends \Espo\Core\Upgrades\Actions\Base
$this->afterRunAction();
$this->clearCache();
/* delete backup files */
$this->deletePackageFiles();

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Copyright (C) 2014-2015 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify

Some files were not shown because too many files have changed in this diff Show More