aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorplegall <plg@piwigo.org>2016-01-06 13:42:30 +0100
committerplegall <plg@piwigo.org>2016-01-06 13:42:30 +0100
commit7bd36e02406985b4a5b9b2e4caef13234569268d (patch)
treeaff260a268f5b7723383bde53d79d6b6c4da79fb
parent67e142f33197af955e179a1ad09b990ac80b6698 (diff)
feature #259, notify an album to a list of users
... and not just to a group
-rw-r--r--admin/album_notification.php180
-rw-r--r--admin/themes/default/template/album_notification.tpl103
-rw-r--r--language/en_UK/admin.lang.php3
-rw-r--r--language/fr_FR/admin.lang.php3
4 files changed, 247 insertions, 42 deletions
diff --git a/admin/album_notification.php b/admin/album_notification.php
index 4dd578b1a..977c7b43a 100644
--- a/admin/album_notification.php
+++ b/admin/album_notification.php
@@ -46,7 +46,7 @@ $page['cat'] = $category['id'];
// +-----------------------------------------------------------------------+
// info by email to an access granted group of category informations
-if (isset($_POST['submitEmail']) and !empty($_POST['group']))
+if (isset($_POST['submitEmail']))
{
set_make_full_url();
@@ -80,41 +80,111 @@ SELECT id, file, path, representative_ext
}
}
- pwg_mail_group(
- $_POST['group'],
- array(
- 'subject' => l10n('[%s] Visit album %s', $conf['gallery_title'], trigger_change('render_category_name', $category['name'], 'admin_cat_list')),
- // TODO : change this language variable to 'Visit album %s'
- // TODO : 'language_selected' => ....
- ),
- array(
- 'filename' => 'cat_group_info',
- 'assign' => array(
- 'IMG' => $img,
- 'CAT_NAME' => trigger_change('render_category_name', $category['name'], 'admin_cat_list'),
- 'LINK' => make_index_url(array(
- 'category' => array(
- 'id' => $category['id'],
- 'name' => trigger_change('render_category_name', $category['name'], 'admin_cat_list'),
- 'permalink' => $category['permalink']
- )
- )),
- 'CPL_CONTENT' => empty($_POST['mail_content']) ? '' : stripslashes($_POST['mail_content']),
- )
+ $args = array(
+ 'subject' => l10n('[%s] Visit album %s', $conf['gallery_title'], trigger_change('render_category_name', $category['name'], 'admin_cat_list')),
+ // TODO : change this language variable to 'Visit album %s'
+ // TODO : 'language_selected' => ....
+ );
+
+ $tpl = array(
+ 'filename' => 'cat_group_info',
+ 'assign' => array(
+ 'IMG' => $img,
+ 'CAT_NAME' => trigger_change('render_category_name', $category['name'], 'admin_cat_list'),
+ 'LINK' => make_index_url(
+ array(
+ 'category' => array(
+ 'id' => $category['id'],
+ 'name' => trigger_change('render_category_name', $category['name'], 'admin_cat_list'),
+ 'permalink' => $category['permalink']
+ )
+ )
+ ),
+ 'CPL_CONTENT' => empty($_POST['mail_content']) ? '' : stripslashes($_POST['mail_content']),
)
);
- unset_make_full_url();
+ if ('users' == $_POST['who'] and isset($_POST['users']) and count($_POST['users']) > 0)
+ {
+ check_input_parameter('users', $_POST, true, PATTERN_ID);
- $query = '
+ // TODO code very similar to function pwg_mail_group. We'd better create
+ // a function pwg_mail_users that could be called from here and from
+ // pwg_mail_group
+
+ // TODO to make checks even better, we should check that theses users
+ // have access to this album. No real privacy issue here, even if we
+ // send the email to a user without permission.
+
+ $query = '
+SELECT
+ ui.user_id,
+ ui.status,
+ ui.language,
+ u.'.$conf['user_fields']['email'].' AS email,
+ u.'.$conf['user_fields']['username'].' AS username
+ FROM '.USER_INFOS_TABLE.' AS ui
+ JOIN '.USERS_TABLE.' AS u ON u.'.$conf['user_fields']['id'].' = ui.user_id
+ WHERE ui.user_id IN ('.implode(',', $_POST['users']).')
+;';
+ $users = query2array($query);
+ $usernames = array();
+
+ foreach ($users as $u)
+ {
+ $usernames[] = $u['username'];
+
+ $authkey = create_user_auth_key($u['user_id'], $u['status']);
+
+ $user_tpl = $tpl;
+
+ if ($authkey !== false)
+ {
+ $user_tpl['assign']['LINK'] = add_url_params($tpl['assign']['LINK'], array('auth' => $authkey['auth_key']));
+
+ if (isset($user_tpl['assign']['IMG']['link']))
+ {
+ $user_tpl['assign']['IMG']['link'] = add_url_params(
+ $user_tpl['assign']['IMG']['link'],
+ array('auth' => $authkey['auth_key'])
+ );
+ }
+ }
+
+ $user_args = $args;
+ if (isset($authkey))
+ {
+ $user_args['auth_key'] = $authkey['auth_key'];
+ }
+
+ switch_lang_to($u['language']);
+ pwg_mail($u['email'], $user_args, $user_tpl);
+ switch_lang_back();
+ }
+
+ $message = l10n_dec('%d mail was sent.', '%d mails were sent.', count($users));
+ $message.= ' ('.implode(', ', $usernames).')';
+
+ $page['infos'][] = $message;
+ }
+ elseif ('group' == $_POST['who'] and !empty($_POST['group']))
+ {
+ check_input_parameter('group', $_POST, false, PATTERN_ID);
+
+ pwg_mail_group($_POST['group'], $args, $tpl);
+
+ $query = '
SELECT
name
FROM '.GROUPS_TABLE.'
WHERE id = '.$_POST['group'].'
;';
- list($group_name) = pwg_db_fetch_row(pwg_query($query));
+ list($group_name) = pwg_db_fetch_row(pwg_query($query));
- $page['infos'][] = l10n('An information email was sent to group "%s"', $group_name);
+ $page['infos'][] = l10n('An information email was sent to group "%s"', $group_name);
+ }
+
+ unset_make_full_url();
}
// +-----------------------------------------------------------------------+
@@ -189,6 +259,64 @@ SELECT
}
}
+// all users with status != guest and permitted to this this album (for a
+// perfect search, we should also check that album is not only filled with
+// private photos)
+$query = '
+SELECT
+ user_id
+ FROM '.USER_INFOS_TABLE.'
+ WHERE status != \'guest\'
+;';
+$all_user_ids = query2array($query, null, 'user_id');
+
+if ('private' == $category['status'])
+{
+ $user_ids_access_indirect = array();
+
+ if (isset($group_ids) and count($group_ids) > 0)
+ {
+ $query = '
+SELECT
+ user_id
+ FROM '.USER_GROUP_TABLE.'
+ WHERE group_id IN ('.implode(',', $group_ids).')
+';
+ $user_ids_access_indirect = query2array($query, null, 'user_id');
+ }
+
+ $query = '
+SELECT
+ user_id
+ FROM '.USER_ACCESS_TABLE.'
+ WHERE cat_id = '.$category['id'].'
+;';
+ $user_ids_access_direct = query2array($query, null, 'user_id');
+
+ $user_ids_access = array_unique(array_merge($user_ids_access_direct, $user_ids_access_indirect));
+
+ $user_ids = array_intersect($user_ids_access, $all_user_ids);
+}
+else
+{
+ $user_ids = $all_user_ids;
+}
+
+if (count($user_ids) > 0)
+{
+ $query = '
+SELECT
+ '.$conf['user_fields']['id'].' AS id,
+ '.$conf['user_fields']['username'].' AS username
+ FROM '.USERS_TABLE.'
+ WHERE id IN ('.implode(',', $user_ids).')
+;';
+
+ $users = query2array($query, 'id', 'username');
+
+ $template->assign('user_options', $users);
+}
+
// +-----------------------------------------------------------------------+
// | sending html code |
// +-----------------------------------------------------------------------+
diff --git a/admin/themes/default/template/album_notification.tpl b/admin/themes/default/template/album_notification.tpl
index 32aa8e414..8573cf16e 100644
--- a/admin/themes/default/template/album_notification.tpl
+++ b/admin/themes/default/template/album_notification.tpl
@@ -1,3 +1,59 @@
+{combine_script id='jquery.selectize' load='footer' path='themes/default/js/plugins/selectize.min.js'}
+{combine_css id='jquery.selectize' path="themes/default/js/plugins/selectize.{$themeconf.colorscheme}.css"}
+
+{footer_script}
+jQuery(document).ready(function() {
+ jQuery("select[name=who]").change(function () {
+ checkWhoOptions();
+ });
+
+ checkWhoOptions();
+
+ function checkWhoOptions() {
+ var option = jQuery("select[name=who] option:selected").val();
+ jQuery(".who_option").hide();
+ jQuery(".who_" + option).show();
+ }
+
+ jQuery(".who_option select").selectize({
+ plugins: ['remove_button']
+ });
+
+ jQuery("form#categoryNotify").submit(function(e) {
+ var who_selected = false;
+ var who_option = jQuery("select[name=who] option:selected").val();
+
+ if (jQuery(".who_" + who_option + " select").length > 0) {
+ if (jQuery(".who_" + who_option + " select option:selected").length > 0) {
+ who_selected = true;
+ }
+ }
+
+ if (!who_selected) {
+ jQuery(".actionButtons .errors").show();
+ e.preventDefault();
+ }
+ else {
+ jQuery(".actionButtons .errors").hide();
+ console.log("form can be submited");
+ }
+ });
+});
+{/footer_script}
+
+{html_style}
+.who_option {
+ margin-top:5px;
+}
+
+span.errors {
+ background-image:none;
+ padding:2px 5px;
+ margin:0;
+ border-radius:5px;
+}
+{/html_style}
+
<div class="titrePage">
<h2><span style="letter-spacing:0">{$CATEGORIES_NAV}</span> &#8250; {'Edit album'|@translate} {$TABSHEET_TITLE}</h2>
</div>
@@ -5,36 +61,51 @@
<form action="{$F_ACTION}" method="post" id="categoryNotify">
<fieldset id="emailCatInfo">
- <legend>{'Send an information email to group members'|@translate}</legend>
-
-{if isset($group_mail_options)}
+ <legend>{'Send mail to users'|@translate}</legend>
<p>
- <strong>{'Group'|@translate}</strong>
- <br>
- <select name="group">
- {html_options options=$group_mail_options}
+ <strong>{'Recipients'|@translate}</strong>
+ <select name="who">
+ <option value="group">{'Group'|translate}</option>
+ <option value="users">{'Users'|translate}</option>
</select>
</p>
+ <p class="who_option who_group">
+{if isset($group_mail_options)}
+ <select name="group" placeholder="{'Type in a search term'|translate}" style="width:524px;">
+ {html_options options=$group_mail_options}
+ </select>
+{elseif isset($no_group_in_gallery) and $no_group_in_gallery}
+ {'There is no group in this gallery.'|@translate} <a href="admin.php?page=group_list" class="externalLink">{'Group management'|@translate}</a>
+{else}
+ {'No group is permitted to see this private album'|@translate}.
+ <a href="{$permission_url}" class="externalLink">{'Permission management'|@translate}</a>
+{/if}
+ </p>
+
+ <p class="who_option who_users">
+{if isset($user_options)}
+ <select name="users[]" multiple placeholder="{'Type in a search term'|translate}" style="width:524px;">
+ {html_options options=$user_options selected=$user_options_selected}
+ </select>
+{else}
+ {'No user is permitted to see this private album'|@translate}.
+ <a href="{$permission_url}" class="externalLink">{'Permission management'|@translate}</a>
+{/if}
+ </p>
+
<p>
<strong>{'Complementary mail content'|@translate}</strong>
<br>
<textarea cols="50" rows="5" name="mail_content" id="mail_content" class="description">{$MAIL_CONTENT}</textarea>
</p>
- <p>
+ <p class="actionButtons">
<input class="submit" type="submit" value="{'Send'|@translate}" name="submitEmail">
+ <span class="errors" style="display:none">&#x2718; {'No recipient selected'|translate}</span>
</p>
-{elseif isset($no_group_in_gallery) and $no_group_in_gallery}
- <p>{'There is no group in this gallery.'|@translate} <a href="admin.php?page=group_list" class="externalLink">{'Group management'|@translate}</a></p>
-{else}
- <p>
- {'No group is permitted to see this private album'|@translate}.
- <a href="{$permission_url}" class="externalLink">{'Permission management'|@translate}</a>
- </p>
-{/if}
</fieldset>
</form>
diff --git a/language/en_UK/admin.lang.php b/language/en_UK/admin.lang.php
index 272d2bf63..0784fd46c 100644
--- a/language/en_UK/admin.lang.php
+++ b/language/en_UK/admin.lang.php
@@ -984,3 +984,6 @@ $lang['width & height'] = 'width & height';
$lang['Upload in progress'] = 'Upload in progress';
$lang['Orphans'] = 'Orphans';
$lang['Delete %d orphan photos'] = 'Delete %d orphan photos';
+$lang['Recipients'] = 'Recipients';
+$lang['No recipient selected'] = 'No recipient selected';
+$lang['No user is permitted to see this private album'] = 'No user is permitted to see this private album'; \ No newline at end of file
diff --git a/language/fr_FR/admin.lang.php b/language/fr_FR/admin.lang.php
index 7bd93f439..09e75eecd 100644
--- a/language/fr_FR/admin.lang.php
+++ b/language/fr_FR/admin.lang.php
@@ -985,3 +985,6 @@ $lang['No and unlock sub-albums'] = 'Non, et déverrouiller les sous-albums';
$lang['Upload in progress'] = 'Transfert en cours...';
$lang['Orphans'] = 'Orphelines';
$lang['Delete %d orphan photos'] = 'Supprimer les %d photos orphelines';
+$lang['Recipients'] = 'Destinataires';
+$lang['No recipient selected'] = 'Choisissez un destinataire';
+$lang['No user is permitted to see this private album'] = 'Aucun utilisateur n\'est autorisé à voir cet album privé'; \ No newline at end of file