From ebf0e212875026a5fb76cf0757f9894b4536af5c Mon Sep 17 00:00:00 2001 From: Marc Michalsky forumZFD Date: Thu, 18 Mar 2021 13:45:30 +0100 Subject: [PATCH 1/6] =?UTF-8?q?=F0=9F=9A=80=20synchronize=20events=20if=20?= =?UTF-8?q?unknown=20event=20id=20is=20transmitted?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CRM/TwingleCampaign/Utils/APIWrapper.php | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/CRM/TwingleCampaign/Utils/APIWrapper.php b/CRM/TwingleCampaign/Utils/APIWrapper.php index 404306e..5afe426 100644 --- a/CRM/TwingleCampaign/Utils/APIWrapper.php +++ b/CRM/TwingleCampaign/Utils/APIWrapper.php @@ -141,7 +141,17 @@ class CRM_TwingleCampaign_Utils_APIWrapper { ['event_id' => $apiRequest['params']['custom_fields']['event']] ); } catch (CiviCRM_API3_Exception $e) { - // Do nothing + // If no event was found, sync all Events and try it again + try { + $test = civicrm_api3('TwingleEvent', 'sync'); + $targetCampaign = civicrm_api3( + 'TwingleEvent', + 'getsingle', + ['event_id' => $apiRequest['params']['custom_fields']['event']] + ); + } catch (CiviCRM_API3_Exception $e) { + // there's nothing left to do + } } } else { From 3083feae5e6398e9730e56c6a490e71d6b98c5e9 Mon Sep 17 00:00:00 2001 From: Marc Michalsky forumZFD Date: Thu, 18 Mar 2021 15:07:46 +0100 Subject: [PATCH 2/6] =?UTF-8?q?=F0=9F=9A=80=20create=20scheduled=20job=20o?= =?UTF-8?q?n=20installation=20to=20trigger=20TwingleSync.sync?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CRM/TwingleCampaign/Upgrader.php | 97 +++++++++++++++++++++++++++++++- 1 file changed, 94 insertions(+), 3 deletions(-) diff --git a/CRM/TwingleCampaign/Upgrader.php b/CRM/TwingleCampaign/Upgrader.php index a2b5da2..f17783e 100644 --- a/CRM/TwingleCampaign/Upgrader.php +++ b/CRM/TwingleCampaign/Upgrader.php @@ -6,6 +6,7 @@ use CRM_TwingleCampaign_BAO_CustomGroup as CustomGroup; use CRM_TwingleCampaign_BAO_Configuration as Configuration; use CRM_TwingleCampaign_BAO_OptionValue as OptionValue; use CRM_TwingleCampaign_Utils_ExtensionCache as Cache; +use CRM_TwingleCampaign_ExtensionUtil as E; /** * Collection of upgrade steps. @@ -55,6 +56,30 @@ class CRM_TwingleCampaign_Upgrader extends CRM_TwingleCampaign_Upgrader_Base { $ov = new OptionValue($option_value); $ov->create(); } + + // setup cron job to trigger synchronization + try { + civicrm_api3('Job', 'create', [ + 'run_frequency' => "Hourly", + 'name' => "TwingleSync", + 'api_entity' => "TwingleSync", + 'api_action' => "sync", + 'description' => E::ts("Syncronizes all TwingleProjects an TwingleEvents between CiviCRM and Twingle"), + 'is_active' => 1, + ]); + } catch (CiviCRM_API3_Exception $e) { + Civi::log()->error( + E::LONG_NAME . + ' could not create scheduled job on extension installation: ' . + $e->getMessage() + ); + CRM_Core_Session::setStatus( + E::ts('Could not create scheduled job "TwingleSync".'), + E::ts('Scheduled Job'), + error + ); + CRM_Utils_System::setUFMessage(E::ts('Could not create scheduled job "TwingleSync". Your Campaigns will not get synchronized to Twingle.')); + } } /** @@ -93,21 +118,87 @@ class CRM_TwingleCampaign_Upgrader extends CRM_TwingleCampaign_Upgrader_Base { // Delete all settings for this extension Configuration::deleteAll(); + // Delete cron job + try { + $jobId = civicrm_api3('Job', 'getsingle', [ + 'name' => "TwingleSync", + ])['id']; + civicrm_api3('Job', 'delete', [ + 'id' => $jobId, + ]); + } catch (CiviCRM_API3_Exception $e) { + Civi::log()->error( + E::LONG_NAME . + ' could not delete scheduled job on extension uninstallation: ' . + $e->getMessage() + ); + CRM_Core_Session::setStatus( + E::ts('Could not delete scheduled job "TwingleSync".'), + E::ts('Scheduled Job'), + error + ); + } + } /** * @throws \Exception */ public function enable() { - + // Enable cron job + try { + $jobId = civicrm_api3('Job', 'getsingle', [ + 'name' => "TwingleSync", + ])['id']; + civicrm_api3('Job', 'create', [ + 'id' => $jobId, + 'is_active' => 1, + ]); + } catch (CiviCRM_API3_Exception $e) { + Civi::log()->error( + E::LONG_NAME . + ' could not activate scheduled job on extension activation: ' . + $e->getMessage() + ); + CRM_Core_Session::setStatus( + E::ts('Could not activate scheduled job "TwingleSync". Your Campaigns will not get synchronized to Twingle.'), + E::ts('Scheduled Job'), + error + ); + } } /** * @throws \Exception */ - public function disable() { + public function disable() { - } + // Disable cron job + try { + $jobId = civicrm_api3('Job', 'getsingle', [ + 'name' => 'TwingleSync', + ])['id']; + civicrm_api3('Job', 'create', [ + 'id' => $jobId, + 'is_active' => 0, + ]); + } catch (CiviCRM_API3_Exception $e) { + Civi::log()->error( + E::LONG_NAME . + ' could not disable scheduled job on extension deactivation: ' . + $e->getMessage() + ); + CRM_Core_Session::setStatus( + E::ts('Could not disable scheduled job "TwingleSync".'), + E::ts('Scheduled Job'), + error + ); + } + + // Remove Twingle api key from settings + Civi::settings()->revert('twingle_api_key'); + + } /** * Example: Run a couple simple queries. From 1e6feda9232afbd709e1590237b7b10fcdcc787c Mon Sep 17 00:00:00 2001 From: Marc Michalsky forumZFD Date: Thu, 18 Mar 2021 15:51:28 +0100 Subject: [PATCH 3/6] =?UTF-8?q?=F0=9F=94=A7=20fixing=20some=20'unknown=20i?= =?UTF-8?q?ndex'=20warnings?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CRM/TwingleCampaign/BAO/Campaign.php | 6 ++++-- CRM/TwingleCampaign/BAO/TwingleEvent.php | 16 ++++++++++------ api/v3/TwingleEvent/Sync.php | 4 ++-- api/v3/TwingleProject/Sync.php | 2 +- 4 files changed, 17 insertions(+), 11 deletions(-) diff --git a/CRM/TwingleCampaign/BAO/Campaign.php b/CRM/TwingleCampaign/BAO/Campaign.php index c29d3a0..108154d 100644 --- a/CRM/TwingleCampaign/BAO/Campaign.php +++ b/CRM/TwingleCampaign/BAO/Campaign.php @@ -181,8 +181,10 @@ abstract class CRM_TwingleCampaign_BAO_Campaign { // Translate keys foreach ($field_translations as $origin => $translation) { - $values[$translation] = $values[$origin]; - unset($values[$origin]); + if (isset($values[$origin])) { + $values[$translation] = $values[$origin]; + unset($values[$origin]); + } } } diff --git a/CRM/TwingleCampaign/BAO/TwingleEvent.php b/CRM/TwingleCampaign/BAO/TwingleEvent.php index f95d5b3..e779fac 100644 --- a/CRM/TwingleCampaign/BAO/TwingleEvent.php +++ b/CRM/TwingleCampaign/BAO/TwingleEvent.php @@ -27,11 +27,13 @@ class CRM_TwingleCampaign_BAO_TwingleEvent extends Campaign { $this->id_custom_field = Cache::getInstance() ->getCustomFieldMapping()['twingle_event_id']; - try { - $this->values['parent_id'] = $this->getParentCampaignId(); - } catch (CiviCRM_API3_Exception $e) { - $errorMessage = $e->getMessage(); - throw new Exception("Could not identify parent Campaign: $errorMessage"); + if ($id) { + try { + $this->values['parent_id'] = $this->getParentCampaignId(); + } catch (CiviCRM_API3_Exception $e) { + $errorMessage = $e->getMessage(); + throw new Exception("Could not identify parent Campaign: $errorMessage"); + } } } @@ -152,7 +154,9 @@ class CRM_TwingleCampaign_BAO_TwingleEvent extends Campaign { self::getTimestamp($values['created_at']); // Cast project target to integer - $values['project_target'] = (int) $values['project_target']; + if (isset($values['project_target'])) { + $values['project_target'] = (int) $values['project_target']; + } } else { diff --git a/api/v3/TwingleEvent/Sync.php b/api/v3/TwingleEvent/Sync.php index f9c51ce..1797b4e 100644 --- a/api/v3/TwingleEvent/Sync.php +++ b/api/v3/TwingleEvent/Sync.php @@ -99,7 +99,7 @@ function civicrm_api3_twingle_event_Sync(array $params): array { $twingleApi = Civi::cache()->get('twinglecampaign_twingle_api'); if (NULL === $twingleApi || $params['twingle_api_key'] || $params['limit']) { try { - if ($params['limit']) { + if (isset($params['limit'])) { $twingleApi = new TwingleApiCall($apiKey, $params['limit']); } else { @@ -112,7 +112,7 @@ function civicrm_api3_twingle_event_Sync(array $params): array { } // If an id or a event_id is provided, synchronize only this one campaign - if ($params['id'] || $params['event_id']) { + if (isset($params['id']) || isset($params['event_id'])) { // Get project from db via API $params['sequential'] = 1; diff --git a/api/v3/TwingleProject/Sync.php b/api/v3/TwingleProject/Sync.php index 4c1b38d..039f72a 100644 --- a/api/v3/TwingleProject/Sync.php +++ b/api/v3/TwingleProject/Sync.php @@ -91,7 +91,7 @@ function civicrm_api3_twingle_project_Sync(array $params): array { } // If an id or a project_id is given, synchronize only this one campaign - if ($params['id'] || $params['project_id']) { + if (isset($params['id']) || isset($params['project_id'])) { // Get project from db via API $params['sequential'] = 1; From 55f7977c79178778fa76a5d9a04ec594f176d32b Mon Sep 17 00:00:00 2001 From: Marc Michalsky forumZFD Date: Thu, 18 Mar 2021 15:54:49 +0100 Subject: [PATCH 4/6] =?UTF-8?q?=F0=9F=A7=B9=20code=20cleanup?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CRM/TwingleCampaign/BAO/TwingleCampaign.php | 5 ++- CRM/TwingleCampaign/Upgrader.php | 38 ++++++++++----------- 2 files changed, 21 insertions(+), 22 deletions(-) diff --git a/CRM/TwingleCampaign/BAO/TwingleCampaign.php b/CRM/TwingleCampaign/BAO/TwingleCampaign.php index 74411cc..3bc15e9 100644 --- a/CRM/TwingleCampaign/BAO/TwingleCampaign.php +++ b/CRM/TwingleCampaign/BAO/TwingleCampaign.php @@ -163,10 +163,9 @@ class CRM_TwingleCampaign_BAO_TwingleCampaign { // UI, log an error and delete this TwingleCampaign else { CRM_Core_Session::setStatus( - ts("Could not determine parent TwingleProject URL. This URL is - needed to create the TwingleEvent URL. Please check the logs."), + ts("Could not determine parent TwingleProject URL. This URL is needed to create the TwingleEvent URL. Please check the logs."), ts('Parent project URL missing'), - 'alert' + 'error' ); Civi::log()->error( E::LONG_NAME . diff --git a/CRM/TwingleCampaign/Upgrader.php b/CRM/TwingleCampaign/Upgrader.php index f17783e..dea29ab 100644 --- a/CRM/TwingleCampaign/Upgrader.php +++ b/CRM/TwingleCampaign/Upgrader.php @@ -147,13 +147,13 @@ class CRM_TwingleCampaign_Upgrader extends CRM_TwingleCampaign_Upgrader_Base { public function enable() { // Enable cron job try { - $jobId = civicrm_api3('Job', 'getsingle', [ - 'name' => "TwingleSync", - ])['id']; - civicrm_api3('Job', 'create', [ - 'id' => $jobId, - 'is_active' => 1, - ]); + $jobId = civicrm_api3('Job', 'getsingle', [ + 'name' => "TwingleSync", + ])['id']; + civicrm_api3('Job', 'create', [ + 'id' => $jobId, + 'is_active' => 1, + ]); } catch (CiviCRM_API3_Exception $e) { Civi::log()->error( E::LONG_NAME . @@ -200,18 +200,18 @@ class CRM_TwingleCampaign_Upgrader extends CRM_TwingleCampaign_Upgrader_Base { } - /** - * Example: Run a couple simple queries. - * - * @return TRUE on success - * @throws Exception - * - * public function upgrade_4200() { - * $this->ctx->log->info('Applying update 4200'); - * CRM_Core_DAO::executeQuery('UPDATE foo SET bar = "whiz"'); - * CRM_Core_DAO::executeQuery('DELETE FROM bang WHERE willy = wonka(2)'); - * return TRUE; - * } // */ + /** + * Example: Run a couple simple queries. + * + * @return TRUE on success + * @throws Exception + * + * public function upgrade_4200() { + * $this->ctx->log->info('Applying update 4200'); + * CRM_Core_DAO::executeQuery('UPDATE foo SET bar = "whiz"'); + * CRM_Core_DAO::executeQuery('DELETE FROM bang WHERE willy = wonka(2)'); + * return TRUE; + * } // */ /** From 87e72052b031c5e398ff73f49923f385a2400b2f Mon Sep 17 00:00:00 2001 From: Marc Michalsky forumZFD Date: Thu, 18 Mar 2021 15:55:54 +0100 Subject: [PATCH 5/6] =?UTF-8?q?=F0=9F=92=AC=20display=20message=20when=20c?= =?UTF-8?q?onfiguration=20is=20saved?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CRM/TwingleCampaign/Form/Settings.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CRM/TwingleCampaign/Form/Settings.php b/CRM/TwingleCampaign/Form/Settings.php index 49a52d4..f76e869 100644 --- a/CRM/TwingleCampaign/Form/Settings.php +++ b/CRM/TwingleCampaign/Form/Settings.php @@ -70,6 +70,9 @@ class CRM_TwingleCampaign_Form_Settings extends CRM_Core_Form { // Set configuration values Configuration::set($this->exportValues()); parent::postProcess(); + + // Display message + CRM_Utils_System::setUFMessage(E::ts('TwingleCampaign configuration saved')); } /** From 91eaadae79b0b075fa5ececa51080d1e777b631f Mon Sep 17 00:00:00 2001 From: Marc Michalsky forumZFD Date: Thu, 18 Mar 2021 16:14:32 +0100 Subject: [PATCH 6/6] =?UTF-8?q?=F0=9F=87=A9=F0=9F=87=AA=20update=20German?= =?UTF-8?q?=20translations?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CRM/TwingleCampaign/BAO/TwingleCampaign.php | 3 +- api/v3/TwingleCampaign/Get.php | 2 +- l10n/de_DE/LC_MESSAGES/twinglecampaign.mo | Bin 6025 -> 7520 bytes l10n/de_DE/LC_MESSAGES/twinglecampaign.po | 92 ++++++++++++++++---- l10n/pot/twinglecampaign.pot | 44 +++++++++- 5 files changed, 116 insertions(+), 25 deletions(-) diff --git a/CRM/TwingleCampaign/BAO/TwingleCampaign.php b/CRM/TwingleCampaign/BAO/TwingleCampaign.php index 3bc15e9..c50118e 100644 --- a/CRM/TwingleCampaign/BAO/TwingleCampaign.php +++ b/CRM/TwingleCampaign/BAO/TwingleCampaign.php @@ -181,8 +181,7 @@ class CRM_TwingleCampaign_BAO_TwingleCampaign { } else { CRM_Core_Session::setStatus( - ts("TwingleCampaigns can only get created as a child of a - TwingleProject in the campaign tree."), + ts("TwingleCampaigns can only get created as a child of a TwingleProject in the campaign tree."), ts('No parent TwingleProject found'), 'alert' ); diff --git a/api/v3/TwingleCampaign/Get.php b/api/v3/TwingleCampaign/Get.php index cf1c42d..4a280a8 100644 --- a/api/v3/TwingleCampaign/Get.php +++ b/api/v3/TwingleCampaign/Get.php @@ -24,7 +24,7 @@ function _civicrm_api3_twingle_campaign_Get_spec(array &$spec) { 'title' => E::ts('Twingle Campaign CID'), 'type' => CRM_Utils_Type::T_STRING, 'api.required' => 0, - 'description' => E::ts('A unique identifier for a TwingleCampaign generated by a hashing its id + name'), + 'description' => E::ts('A unique TwingleCampaign identifier for external usage'), ]; $spec['project_id'] = [ 'name' => 'project_id', diff --git a/l10n/de_DE/LC_MESSAGES/twinglecampaign.mo b/l10n/de_DE/LC_MESSAGES/twinglecampaign.mo index 055c849658e4a6f17e40840fb4f7c843440df160..f491d04cbd9ddea0d621c940e3ddfb9f420184fa 100644 GIT binary patch literal 7520 zcmchbU5q6~6@W|r#AOA=Kg7R+l|S7(!;bu{v%BK#%q|SG!wx&MEG{VYy%C*`rTle;k)22gnI)#3@?NC!t3Aza1wqWib{WgEAY=y?S9)hQ!d_S9yZ-eJU zv73gM!yBQrKMvmmPr|prN1*8WJt%TL2}Q2wpy+WfLWsRDh0=Zk%D8h->~dH69z&7; zK`44Z3a^4cfFjScP}b=MDEe(@5*h!hl6#@p>2`P=4&WQ%lTiBq9*P|QfYR?mCYSde zQ0#gml=1I?B1Z%p@IiP5{4Nwf{52Fi{SCeVUw{YUUzrS*)ii_5!doCFRiA@0-j|{D ze;i7?C!xsoG(;u!cgT-A7op_)CGaG?67Gdxho6AYzOWFF|Np)zzO&$ z+z)>WFM$_fbm7%d^qqls!+YV4@Chh>_#FHg{3jIq9Y;u!KZY7U1b4!3Kv|!spveC( zDE7aANu>QGyb{hsTvPSo4e%r+G}Pk|)2S!mHSlNf2z(xjeHR#nA=MH@6xD?qeiBZ> zuR)rsUqG?jpP=}~zoGc)rMyVLy-?PB8Dcusg_uO0EWdvNiX7j9;&(rUGVZS+Kk6_1 z62IQYN2#BLGT$vw#=i^7_$id}KLbUdufmVQpFpwW4i+EL)b&u>9fs1c1!cVZAwTM~ z{E~Lxgfjn+p{(a`;UwHnut~h_<(I72arhc2-{cWlB_GN20m`)$u{&<>9vM^CL)JMh$8XgAMq)9B(}s(@`(NYa~*$(om}jemEvz=Tgg}AJM!$NEKnqdC2#Ga z9Hxj5i=X(1wC?ht*i@bmQzU*4Q06IO^IIu%6ixAu_`oiT#H_^M^^|>-nu)Oj~xh)jp39a$6V$Wmo=9;6+Ut7?+@x#8c7Nhs5WdjE+t zRL(KRV&N!WgCI;sd2! z4y?%tuFFzvg3M?P-&%EU5+|LkZnrSXf@b{EYolgM<0kD~GhGd^EqR2*h6y!;o zDRC4X*if%TJzTOIcF=1Q{D^17f-)kO%DOIO#Nksz-pIrRecH7GVga|W>7r+r=9Pr1*U^hJQd#;# zWutnB^4k`p+?KqE3$~Mi4b|a(9+8Y<-zW-8tuSIG!&2eHDHvFigXvyouF~KdECP#TNRmzw8yfHnvpu|tDI&TQsnE#SUrow&mLJUqNCUl)Cy~? zR)&FFSx_{u*LzjVYRLg-_U*pxAkuTyoDi1@S}l`_e^trBd5*Mjb{ZX}auk>1{S?(Q zj@0_KddaU|?v{^X-wXE@5tV=Uqv%;tu`ti5HOA}QKDDJ~u{Zf@w*=0XW$&V*N)f)@ zR);*(m(m9-@rDWJj5)h%cR1|?mNYAYQy0b?r>1dLRhU#z3IGnzZYG*4*R=c?UJ-8s7`0n(1xE*Yp7)p*L-*#uC*ge_9 zr}a`IyRV*_xNc$!88U{KZn5m}B4~_9#f^hW+RLW3?Yq}(-_#ym{JHOHt1sK9cU`lm zQec`qe9zp0ZR!A?VmQMW z7bHJ*EN}RWf6;3u-F%EuI01))wAEFcpO!a7$T%VldZ?9Z-@58%oj<#s)n#jrC4K>h2kflg{S{4)C!h=G8pvn6Zc~bEo>41Vu1t>-C_>4o(7M zj(dj-6%HeAv3-DJ45x7F?!LAe*j2rj;0HG8^<-|sbxg0J$rGpba1ADdCJ8C%9*;{BMzqKFitre$6&o0h^xq5VR%&#`wcG( zTo5BGK1!lRuX=I|B`wR=hR+<7D}hsZYj6cNX2)R=|Idsf*V3a(3r?gKhYkt6daB6u z#(E_GJ{jI4YE6oJ#N05wjGUb7_2mR&HK{HvH@@~4m^&?$Wv1ZWIpRKD7e z^gp;wut)n*-I9vwMk`qPT2k`gBsod$Dcv`#It@QKtt7+M`$&f(bjsRN_o`9-NSW28 zDI0F7TFqC?c$^PyK=A=H)=na?sLShgFl*Yov%9Ktq)Q% mxLhqH`*F1(o_czw$-j%m!q#Q}ExAOwbDdw#Egs?aGW8$uMVy%c delta 1736 zcmY+^duYvJ9LMoz$80t`&dwa{zOxxKGrO>H<}#OU$fR`m!x+cRN-oQ$%s(e#!}!O~ z5>hB)q&R40|0%hp#?*4lKa}KBO3Eeg&(H59Pv?7Hzx(q%-|zGLy{S4_5`LW$+hb^p zh)g2rGA4wFWBH>c#~G7|UM$B<9Er=(hYdIuThWbOI2wC!6kfsBkHlKt1mxW}`R3n0zcn53WQ% zHe(w7n@%>;IdBFw;@en?4^TKq%e ziTzge;vj}~<2yDqfZwPaQYfVM3s5PXg?jL6)Bv_(F?Qhuyop*nFHjl!j*syd@-vS} z>q2~vbYZfYzMfO$A^*CumIJzQ18P96s8Sq2b$r}8--{R6@55qTM|!5>5lqE?$7iU4 zf5J8BX1X(QGivRe!$!R5CI3oAJiTZ{Y3RpkI0b{K6z@R|=n`si^`WkRi4*Y~QU#Mm z+A6USSvF=p7UE`9W{#mIcmh@8YhgD0Y}~_ge2*t9Yx+?g4B#ewi^^C% z7bydcsPnr}*B?eb=PatUH&E9NpgR75Dp?$9DAD_0!G>OsW>jtVVhmOiYRZb5*2g5G zidaOH64QxcM6_vOa|ym-cD*%2EzmiHvY?Vgo64yE?fTS4kD>;n_gGD$ z@5bNv9B1o*)5xgZlzy#xUJm zawn7}CHnt0Yfi#E>q^41NO|H)m(`P$8yV(a>$3KF3PwaPi}ZRrV%%-*#lan+ZEagZ z?b~-)+1{<5`p~wPouQWID*wjjbv3otA#a8iNcm`;^ey?ni&wrC*7h-LBc8EWUDo5& c$=1@er>;A