Posiljanje mailov na prave naslove ob pravih spremembah.

Lio Novelli 2024-03-06 00:36:34 +01:00
parent d94ca189c0
commit d9ebb301d6
3 changed files with 126 additions and 9 deletions

View File

@ -0,0 +1,12 @@
# Yufu Admin
Administrativna in uredniška funkcionalnost.
Obveščanje preko mailov, ko se spremeni revizija koncepta.
## Testiranje
1. Kot anonimni uporabnik predlagamo spremembe koncepta preko frontend apija.
2. Kot urednik objavimo predlagane spremembe.
- Fino bi bilo imet pregled (view) predlaganih in še ne objavljenih sprememb.
3. Pogledamo v mailhog, če so se maili poslali. (ddev status)

View File

@ -0,0 +1,4 @@
# Slovenian translations for yufu_admin module
#
msgid "There was a problem sending your message and it was not sent. For transition @transition."
msgstr "Prišlo je do problema pri pošiljanju e-poštnega sporočila in le to ni bilo poslano. Za tranzicijo @transition"

View File

@ -15,7 +15,7 @@ use Drupal\node\NodeInterface;
function yufu_admin_entity_operation(EntityInterface $entity) { function yufu_admin_entity_operation(EntityInterface $entity) {
$operations = []; $operations = [];
$entityType = $entity->getEntityType(); $entityType = $entity->getEntityType();
// @todo Only for entity node - should we add other entities as well? // @TODO Only for entity node - should we add other entities as well?
if ($entityType->id() === 'node' && \Drupal::currentUser()->hasPermission('use jsonapi operation link')) { if ($entityType->id() === 'node' && \Drupal::currentUser()->hasPermission('use jsonapi operation link')) {
// Build the url. // Build the url.
$url = Url::fromRoute(sprintf('jsonapi.%s--%s.individual', $entityType->id(), $entity->bundle()), $url = Url::fromRoute(sprintf('jsonapi.%s--%s.individual', $entityType->id(), $entity->bundle()),
@ -67,12 +67,15 @@ function yufu_admin_node_presave(EntityInterface $entity) {
$transition = _yufu_admin_get_node_transition($entity); $transition = _yufu_admin_get_node_transition($entity);
} }
switch ($transition) { switch ($transition) {
case 'stay_draft':
case 'concept_drafted': case 'concept_drafted':
// Send email to editors. // Send email to editors.
_yufu_admin_concept_drafted_mail($entity); _yufu_admin_concept_drafted_mail($entity);
break; break;
case 'concept_approved': case 'concept_approved':
// Send email to revision creator (user). // Send email to revision creator (user).
// @TODO Maybe notify other editors.
_yufu_admin_concept_approved_send_mail($entity);
break; break;
case 'concept_rejectd': case 'concept_rejectd':
// Send email to revision creator (user). // Send email to revision creator (user).
@ -93,10 +96,10 @@ function yufu_admin_node_presave(EntityInterface $entity) {
* Name of the transition. * Name of the transition.
*/ */
function _yufu_admin_get_node_transition(NodeInterface $node) { function _yufu_admin_get_node_transition(NodeInterface $node) {
$original = $node->original; $original = $node->original ?? NULL;
$moderation_state = $node->moderation_state->value; $moderation_state = $node->moderation_state->value;
$previous_state = $original->moderation_state->value; $previous_state = $original?->moderation_state->value ?? NULL;
if ($moderation_state == 'draft' && $previous_state == 'published') { if ($moderation_state == 'draft' && in_array($previous_state, ['published', NULL])) {
return 'concept_drafted'; return 'concept_drafted';
} }
else if ($moderation_state == 'published' && $previous_state == 'draft') { else if ($moderation_state == 'published' && $previous_state == 'draft') {
@ -111,34 +114,55 @@ function _yufu_admin_get_node_transition(NodeInterface $node) {
return NULL; return NULL;
} }
/**
* Notify user that their concept (revision) was published.
*
* @param \Drupal\node\NodeInterface $node
* Concept node that was transitioned into published state.
*/
function _yufu_admin_concept_drafted_mail(NodeInterface $node) { function _yufu_admin_concept_drafted_mail(NodeInterface $node) {
$mailManager = \Drupal::service('plugin.manager.mail'); $mailManager = \Drupal::service('plugin.manager.mail');
$module = 'yufu_admin'; $module = 'yufu_admin';
// @TODO - key doesn't need to be defined again.
$key = 'concept_drafted'; $key = 'concept_drafted';
// To all editors. // To all editors.
$to = _yufu_admin_get_all_editors_emails(); $to = _yufu_admin_get_all_editors_emails();
$params['message'] = t('New concept created: @title - @url', [ $params['message'] = t('New concept created: @title - @url', [
'title' => $node->getTitle(), '@title' => $node->getTitle(),
'url' => $node->toUrl()->toString(), '@url' => $node->toUrl()->toString(),
]); ]);
$params['node_title'] = $entity->label(); $params['node_title'] = $node->getTitle();
$langcode = \Drupal::currentUser()->getPreferredLangcode(); $langcode = \Drupal::currentUser()->getPreferredLangcode();
$send = true; $send = true;
$result = $mailManager->mail($module, $key, $to, $langcode, $params, NULL, $send); $result = $mailManager->mail($module, $key, $to, $langcode, $params, NULL, $send);
// @TODO: Remove code duplications (_yufu_admin_concept_approved_send_mail).
if ($result['result'] !== true) { if ($result['result'] !== true) {
drupal_set_message(t('There was a problem sending your message and it was not sent.'), 'error'); Drupal::logger('yufu_admin')->error(t('There was a problem sending your message and it was not sent. For transition @transition.', [
'@transition' => $key,
]), 'error');
Drupal::messenger()->addError(t('There was a problem sending your message and it was not sent. For transition @transition.', [
'@transition' => $key,
]), 'error');
} }
else { else {
drupal_set_message(t('Your message has been sent.')); Drupal::logger('yufu_admin')->notice(t('Your message has been sent.'));
Drupal::messenger()->addStatus(t('Your message has been sent.'));
} }
} }
/**
* Get a list of emails of all editors.
*
* @return array
* List of strings.
*/
function _yufu_admin_get_all_editors_emails() { function _yufu_admin_get_all_editors_emails() {
$user_storage = \Drupal::entityTypeManager()->getStorage('user'); $user_storage = \Drupal::entityTypeManager()->getStorage('user');
$ids = $user_storage->getQuery() $ids = $user_storage->getQuery()
->condition('status', 1) ->condition('status', 1)
->condition('roles', 'administrator') ->condition('roles', 'administrator')
->accessCheck(FALSE)
->execute(); ->execute();
$editors = $user_storage->loadMultiple($ids); $editors = $user_storage->loadMultiple($ids);
$emails = []; $emails = [];
@ -148,3 +172,80 @@ function _yufu_admin_get_all_editors_emails() {
} }
return $emails; return $emails;
} }
/**
* Notify user that their concept (revision) was published.
*
* @param \Drupal\node\NodeInterface $node
* Concept node that was transitioned into published state.
*/
function _yufu_admin_concept_approved_send_mail(NodeInterface $node) {
$mailManager = \Drupal::service('plugin.manager.mail');
$module = 'yufu_admin';
// @TODO - key doesn't need to be defined again.
$key = 'concept_approved';
// To the revision's authors.
// @TODO - to make this work properly, we should get a list of all authors of
// unpublished revisions so far since the last published revision.
if ($to = _yufu_admin_get_pioneer_email($node)) {
$params['message'] = t('New concept created: @title - @url', [
'@title' => $node->getTitle(),
'@url' => $node->toUrl()->toString(),
]);
}
else {
$to = implode(',', _yufu_admin_get_all_editors_emails());
$params['message'] = t('Published changes not attributed to any of knownn users: @title - @url', [
'title' => $node->getTitle(),
'url' => $node->toUrl()->toString(),
]);
}
$params['node_title'] = $node->getTitle();
$langcode = \Drupal::currentUser()->getPreferredLangcode();
$send = TRUE;
$result = $mailManager->mail($module, $key, $to, $langcode, $params, NULL, $send);
if ($result['result'] !== TRUE) {
Drupal::logger('yufu_admin')->error(t('There was a problem sending your message and it was not sent. For transition @transition.', [
'@transition' => $key,
]), 'error');
Drupal::messenger()->addError(t('There was a problem sending your message and it was not sent. For transition @transition.', [
'@transition' => $key,
]), 'error');
}
else {
Drupal::logger('yufu_admin')->notice(t('Your message has been sent.'));
Drupal::messenger()->addStatus(t('Your message has been sent.'));
}
}
/**
* Get the email of person (pioneer) that worked on proposed changes.
*
* @return string|NULL
* List of strings.
*/
function _yufu_admin_get_pioneer_email(NodeInterface $node) {
// $email = $node->uid->entity;
if ($original = $node->original) {
$user = $original->getRevisionUser();
$email = $user->getEmail();
return $email ?? NULL;
}
// @TODO: Make this code nicer.
$user = $node->getRevisionUser();
$email = $user->getEmail();
return $email ?? NULL;
}
/**
* Get a list of emails of people that worked on proposed changes.
*
* @return array
* List of strings.
*/
function _yufu_admin_get_all_pioneer_emails() {
// @TODO: Think it through if it is really needed.
return [];
}