View | Details | Raw Unified | Return to bug 1985
Collapse All | Expand All

(-)a/C4/Letters.pm (-1 / +5 lines)
Lines 719-727 sub GetPreparedLetter { Link Here
719
       }
719
       }
720
    }
720
    }
721
721
722
    my $OPACBaseURL = C4::Context->preference('OPACBaseURL');
722
    my $OPACBaseURL = C4::Context->preference('OPACBaseURL') // '';
723
    $letter->{content} =~ s/<<OPACBaseURL>>/$OPACBaseURL/go;
723
    $letter->{content} =~ s/<<OPACBaseURL>>/$OPACBaseURL/go;
724
724
725
    my $staffClientBaseURL = C4::Context->preference('staffClientBaseURL') // '';
726
    $letter->{content} =~ s/<<staffClientBaseURL>>/$staffClientBaseURL/go;
727
725
    if ($want_librarian) {
728
    if ($want_librarian) {
726
        # parsing librarian name
729
        # parsing librarian name
727
        my $userenv = C4::Context->userenv;
730
        my $userenv = C4::Context->userenv;
Lines 841-846 sub _parseletter_sth { Link Here
841
    ($table eq 'aqbooksellers')    ? "SELECT * FROM $table WHERE             id = ?"                                  :
844
    ($table eq 'aqbooksellers')    ? "SELECT * FROM $table WHERE             id = ?"                                  :
842
    ($table eq 'aqorders'     )    ? "SELECT * FROM $table WHERE    ordernumber = ?"                                  :
845
    ($table eq 'aqorders'     )    ? "SELECT * FROM $table WHERE    ordernumber = ?"                                  :
843
    ($table eq 'opac_news'    )    ? "SELECT * FROM $table WHERE          idnew = ?"                                  :
846
    ($table eq 'opac_news'    )    ? "SELECT * FROM $table WHERE          idnew = ?"                                  :
847
    ($table eq 'reviews'      )    ? "SELECT * FROM $table WHERE       reviewid = ?"                                  :
844
    ($table eq 'article_requests') ? "SELECT * FROM $table WHERE             id = ?"                                  :
848
    ($table eq 'article_requests') ? "SELECT * FROM $table WHERE             id = ?"                                  :
845
    ($table eq 'borrower_modifications') ? "SELECT * FROM $table WHERE verification_token = ?" :
849
    ($table eq 'borrower_modifications') ? "SELECT * FROM $table WHERE verification_token = ?" :
846
    ($table eq 'subscription') ? "SELECT * FROM $table WHERE subscriptionid = ?" :
850
    ($table eq 'subscription') ? "SELECT * FROM $table WHERE subscriptionid = ?" :
(-)a/Koha/Review.pm (+48 lines)
Lines 20-25 use Modern::Perl; Link Here
20
use Carp;
20
use Carp;
21
21
22
use Koha::Database;
22
use Koha::Database;
23
use C4::Letters;
23
24
24
use base qw(Koha::Object);
25
use base qw(Koha::Object);
25
26
Lines 67-70 sub _type { Link Here
67
    return 'Review';
68
    return 'Review';
68
}
69
}
69
70
71
=head3 SendReviewAlert
72
73
    $review->SendReviewAlert($parameters);
74
75
Queue an outgoing email alert when a borrower posts a review,
76
using the passed parameters in a hash reference.
77
78
=cut
79
80
sub SendReviewAlert {
81
    my ( $self, $params ) = @_;
82
83
    my $borrowernumber = $params->{borrowernumber};
84
    my $reviewid = $params->{reviewid};
85
    my $biblionumber = $params->{biblionumber};
86
87
    my $moderatorEmail = C4::Context->preference('CommentModeratorsEmail');
88
    unless ($moderatorEmail) {
89
        carp 'CommentModeratorsEmail is not set!';
90
        return;
91
    }
92
93
    my $letter =  C4::Letters::GetPreparedLetter (
94
        module => 'members',
95
        letter_code => 'COMMENT_CREATED',
96
        tables => {
97
            'reviews'     => $reviewid,
98
            'borrowers'   => $borrowernumber,
99
            'biblio'      => $biblionumber,
100
            'biblioitems' => $biblionumber,
101
        }
102
    );
103
    unless ($letter) {
104
        carp 'COMMENT_CREATED member letter not found!';
105
        return;
106
    }
107
108
    C4::Letters::EnqueueLetter({
109
        letter                 => $letter,
110
        borrowernumber         => $borrowernumber,
111
        message_transport_type => 'email',
112
        to_address             => $moderatorEmail,
113
    });
114
115
    return 1;
116
}
117
70
1;
118
1;
(-)a/installer/data/mysql/atomicupdate/bug_1985.sql (+38 lines)
Line 0 Link Here
1
INSERT IGNORE INTO letter
2
    (module,    code,              branchcode, name,                           is_html,
3
     title,
4
     content, message_transport_type)
5
VALUES
6
    ('members', 'COMMENT_CREATED', '',         'Comment created notification', '0',
7
     'Comment from <<borrowers.cardnumber>> is waiting for moderation',
8
'Dear moderator,
9
10
We want to inform you that borrower <<borrowers.cardnumber>> has just created a new comment on <<biblio.title>>, which is biblionumber <<biblio.biblionumber>>.
11
12
--- BEGIN COMMENT ---
13
<<reviews.review>>
14
--- END COMMENT ---
15
16
To approve:
17
http://<<staffClientBaseURL>>/cgi-bin/koha/reviews/reviewswaiting.pl?op=approve&reviewid=<<reviews.reviewid>>
18
19
To delete:
20
http://<<staffClientBaseURL>>/cgi-bin/koha/reviews/reviewswaiting.pl?op=delete&reviewid=<<reviews.reviewid>>
21
22
Or to review all comments:
23
http://<<staffClientBaseURL>>/cgi-bin/koha/reviews/reviewswaiting.pl
24
25
Check it out!
26
27
Your library.',
28
'email'
29
    );
30
31
INSERT IGNORE INTO systempreferences
32
    (variable,                value,options,
33
     explanation,
34
     type)
35
VALUES
36
    ('CommentModeratorsEmail','',   '',
37
     'The email address where to send a notification (template code COMMENT_CREATED) when a Borrower adds/modifies a review/comment for a Biblio. Set to empty to disable sending email notifications.',
38
     'Textarea');
(-)a/installer/data/mysql/en/mandatory/sample_notices.sql (+25 lines)
Lines 129-134 Your library account has been created. Please verify your email address by click Link Here
129
If you did not initiate this request, you may safely ignore this one-time message. The request will expire shortly.'
129
If you did not initiate this request, you may safely ignore this one-time message. The request will expire shortly.'
130
);
130
);
131
131
132
INSERT INTO  letter (module, code, branchcode, name, is_html, title, content, message_transport_type)
133
VALUES ( 'members', 'COMMENT_CREATED', '', 'Comment created notification', '0', 'Comment from <<borrowers.cardnumber>> is waiting for moderation',
134
'Dear moderator,
135
136
We want to inform you that borrower <<borrowers.cardnumber>> has just created a new comment on <<biblio.title>>, which is biblionumber <<biblio.biblionumber>>.
137
138
--- BEGIN COMMENT ---
139
<<reviews.review>>
140
--- END COMMENT ---
141
142
To approve:
143
http://<<staffClientBaseURL>>/cgi-bin/koha/reviews/reviewswaiting.pl?op=approve&reviewid=<<reviews.reviewid>>
144
145
To delete:
146
http://<<staffClientBaseURL>>/cgi-bin/koha/reviews/reviewswaiting.pl?op=delete&reviewid=<<reviews.reviewid>>
147
148
Or to review all comments:
149
http://<<staffClientBaseURL>>/cgi-bin/koha/reviews/reviewswaiting.pl
150
151
Check it out!
152
153
Your library.',
154
'email'
155
);
156
132
INSERT INTO  letter (module, code, branchcode, name, is_html, title, content)
157
INSERT INTO  letter (module, code, branchcode, name, is_html, title, content)
133
VALUES ('members', 'SHARE_INVITE', '', 'Invitation for sharing a list', '0', 'Share list <<listname>>', 'Dear patron,
158
VALUES ('members', 'SHARE_INVITE', '', 'Invitation for sharing a list', '0', 'Share list <<listname>>', 'Dear patron,
134
159
(-)a/installer/data/mysql/sysprefs.sql (+1 lines)
Lines 110-115 INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, ` Link Here
110
('CoceHost', '', NULL, 'Coce server URL', 'Free'),
110
('CoceHost', '', NULL, 'Coce server URL', 'Free'),
111
('CoceProviders', '', 'aws,gb,ol', 'Coce providers', 'multiple'),
111
('CoceProviders', '', 'aws,gb,ol', 'Coce providers', 'multiple'),
112
('COinSinOPACResults','1','','If ON, use COinS in OPAC search results page.  NOTE: this can slow down search response time significantly','YesNo'),
112
('COinSinOPACResults','1','','If ON, use COinS in OPAC search results page.  NOTE: this can slow down search response time significantly','YesNo'),
113
('CommentModeratorsEmail','','','The email address where to send a notification (template code COMMENT_CREATED) when a Borrower adds/modifies a review/comment for a Biblio. Set to empty to disable sending email notifications.','Textarea'),
113
('ConfirmFutureHolds','0','','Number of days for confirming future holds','Integer'),
114
('ConfirmFutureHolds','0','','Number of days for confirming future holds','Integer'),
114
('ConsiderOnSiteCheckoutsAsNormalCheckouts','1',NULL,'Consider on-site checkouts as normal checkouts','YesNo'),
115
('ConsiderOnSiteCheckoutsAsNormalCheckouts','1',NULL,'Consider on-site checkouts as normal checkouts','YesNo'),
115
('CronjobLog','0',NULL,'If ON, log information from cron jobs.','YesNo'),
116
('CronjobLog','0',NULL,'If ON, log information from cron jobs.','YesNo'),
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/opac.pref (+4 lines)
Lines 450-455 OPAC: Link Here
450
                  no: Hide
450
                  no: Hide
451
            - reviewer's avatar beside comments in OPAC. The avatar will be searched on www.libravatar.org using the patron's e-mail address.
451
            - reviewer's avatar beside comments in OPAC. The avatar will be searched on www.libravatar.org using the patron's e-mail address.
452
        -
452
        -
453
            - The email address where to send a notification (template code COMMENT_CREATED) when a Borrower adds/modifies a review/comment for a Biblio. Set to empty to disable sending email notifications.
454
            - pref: CommentModeratorsEmail
455
              class: textarea
456
        -
453
            - pref: RequestOnOpac
457
            - pref: RequestOnOpac
454
              choices:
458
              choices:
455
                  yes: Allow
459
                  yes: Allow
(-)a/opac/opac-review.pl (-8 / +23 lines)
Lines 31-38 use Koha::Reviews; Link Here
31
31
32
my $query        = new CGI;
32
my $query        = new CGI;
33
my $biblionumber = $query->param('biblionumber');
33
my $biblionumber = $query->param('biblionumber');
34
my $review       = $query->param('review');
34
my $review       = $query->param('review');   # if defined submit
35
my $reviewid     = $query->param('reviewid');
35
my $reviewid     = $query->param('reviewid'); # if defined edit
36
my ( $template, $borrowernumber, $cookie ) = get_template_and_user(
36
my ( $template, $borrowernumber, $cookie ) = get_template_and_user(
37
    {
37
    {
38
        template_name   => "opac-review.tt",
38
        template_name   => "opac-review.tt",
Lines 44-50 my ( $template, $borrowernumber, $cookie ) = get_template_and_user( Link Here
44
44
45
# FIXME: need to allow user to delete their own comment(s)
45
# FIXME: need to allow user to delete their own comment(s)
46
46
47
my ( $clean, @errors, $savedreview );
47
my ( $clean, @errors, $savedreview, $affectedreview );
48
49
my $submitting = ( defined $review && $review ne q{} ) ? 1 : 0;
50
my $editing    = ( defined $reviewid ) ? 1: 0;
51
48
my $biblio = GetBiblioData($biblionumber);
52
my $biblio = GetBiblioData($biblionumber);
49
53
50
if( !$biblio ) {
54
if( !$biblio ) {
Lines 58-64 if( !$biblio ) { Link Here
58
    $review = $savedreview? $savedreview->review: $review;
62
    $review = $savedreview? $savedreview->review: $review;
59
}
63
}
60
64
61
if( !@errors && defined $review ) {
65
if( !@errors && $submitting ) {
62
    if ($review !~ /\S/) {
66
    if ($review !~ /\S/) {
63
        push @errors, {empty=>1};
67
        push @errors, {empty=>1};
64
    } else {
68
    } else {
Lines 72-93 if( !@errors && defined $review ) { Link Here
72
            my $js_ok_review = $clean;
76
            my $js_ok_review = $clean;
73
            $js_ok_review =~ s/"/&quot;/g;    # probably redundant w/ TMPL ESCAPE=JS
77
            $js_ok_review =~ s/"/&quot;/g;    # probably redundant w/ TMPL ESCAPE=JS
74
            $template->param(clean_review=>$js_ok_review);
78
            $template->param(clean_review=>$js_ok_review);
75
            if ($savedreview) {
79
            if ($editing) {
76
                $savedreview->set(
80
                my $updatedreview = $savedreview->set(
77
                    {
81
                    {
78
                        review        => $clean,
82
                        review        => $clean,
79
                        approved      => 0,
83
                        approved      => 0,
80
                        datereviewed  => dt_from_string
84
                        datereviewed  => dt_from_string
81
                    }
85
                    }
82
                )->store;
86
                )->store;
87
                $affectedreview = $updatedreview;
83
            } else {
88
            } else {
84
                $reviewid = Koha::Review->new(
89
                my $newreview = Koha::Review->new(
85
                    {   biblionumber   => $biblionumber,
90
                    {   biblionumber   => $biblionumber,
86
                        borrowernumber => $borrowernumber,
91
                        borrowernumber => $borrowernumber,
87
                        review         => $clean,
92
                        review         => $clean,
88
                    }
93
                    }
89
                )->store->reviewid;
94
                )->store;
95
                $reviewid = $newreview ? $newreview->reviewid : 0;
96
                $affectedreview = $newreview;
90
            }
97
            }
98
            if ($reviewid) {
99
                $affectedreview->SendReviewAlert({
100
                    'borrowernumber' => $borrowernumber,
101
                    'reviewid'       => $reviewid,
102
                    'biblionumber'   => $biblionumber
103
                });
104
            }
105
91
            unless (@errors){ $template->param(WINDOW_CLOSE=>1); }
106
            unless (@errors){ $template->param(WINDOW_CLOSE=>1); }
92
        }
107
        }
93
    }
108
    }
(-)a/t/db_dependent/Koha/Reviews.t (-2 / +43 lines)
Lines 19-28 Link Here
19
19
20
use Modern::Perl;
20
use Modern::Perl;
21
21
22
use Test::More tests => 7;
22
use Test::More tests => 13;
23
use Test::Warn;
23
24
24
use Koha::Review;
25
use Koha::Review;
25
use Koha::Reviews;
26
use Koha::Reviews;
27
use Koha::Notice::Messages;
28
use Koha::Notice::Templates;
29
use t::lib::Mocks;
26
use Koha::Database;
30
use Koha::Database;
27
31
28
use t::lib::TestBuilder;
32
use t::lib::TestBuilder;
Lines 35-40 my $patron_1 = $builder->build({ source => 'Borrower' }); Link Here
35
my $patron_2 = $builder->build({ source => 'Borrower' });
39
my $patron_2 = $builder->build({ source => 'Borrower' });
36
my $biblio_1 = $builder->build({ source => 'Biblio' });
40
my $biblio_1 = $builder->build({ source => 'Biblio' });
37
my $biblio_2 = $builder->build({ source => 'Biblio' });
41
my $biblio_2 = $builder->build({ source => 'Biblio' });
42
my $nb_of_messages = Koha::Notice::Messages->search->count;
38
my $nb_of_reviews = Koha::Reviews->search->count;
43
my $nb_of_reviews = Koha::Reviews->search->count;
39
my $nb_of_approved_reviews = Koha::Reviews->search({ approved => 1 })->count;
44
my $nb_of_approved_reviews = Koha::Reviews->search({ approved => 1 })->count;
40
my $new_review_1_1 = Koha::Review->new({
45
my $new_review_1_1 = Koha::Review->new({
Lines 68-73 is( $retrieved_review_1_1->review, $new_review_1_1->review, 'Find a review by id Link Here
68
$retrieved_review_1_1->delete;
73
$retrieved_review_1_1->delete;
69
is( Koha::Reviews->search->count, $nb_of_reviews + 2, 'Delete should have deleted the review' );
74
is( Koha::Reviews->search->count, $nb_of_reviews + 2, 'Delete should have deleted the review' );
70
75
76
# Test SendReview Alert
77
78
# empty CommentModeratorsEmail
79
t::lib::Mocks::mock_preference('CommentModeratorsEmail',undef);
80
warning_like {
81
$new_review_1_2->SendReviewAlert({
82
    borrowernumber => $patron_1->{borrowernumber},
83
    biblionumber   => $biblio_2->{biblionumber},
84
    reviewid       => $new_review_1_2->reviewid
85
}) } qr/CommentModeratorsEmail is not set!/, 'SendReviewAlert triggered expected CommentModeratorsEmail warning.';
86
is( Koha::Notice::Messages->search->count, $nb_of_messages, 'SendReviewAlert lacking CommentModeratorsEmail triggered nothing.' );
87
88
# set CommentModeratorsEmail
89
t::lib::Mocks::mock_preference('CommentModeratorsEmail','test@test.test');
90
warning_is {
91
$new_review_1_2->SendReviewAlert({
92
    borrowernumber => $patron_1->{borrowernumber},
93
    biblionumber   => $biblio_2->{biblionumber},
94
    reviewid       => $new_review_1_2->reviewid
95
}) } '', 'SendReviewAlert triggered no warnings as expected.';
96
is( Koha::Notice::Messages->search->count, $nb_of_messages+1, 'SendReviewAlert triggered notice.' );
97
98
# letter missing
99
Koha::Notice::Templates->search({
100
    module => 'members',
101
    code => 'COMMENT_CREATED'
102
})->delete;
103
warnings_like {
104
$new_review_1_2->SendReviewAlert({
105
    borrowernumber => $patron_1->{borrowernumber},
106
    biblionumber   => $biblio_2->{biblionumber},
107
    reviewid       => $new_review_1_2->reviewid
108
}) }
109
[ qr/No members COMMENT_CREATED letter transported by email/,
110
  qr/COMMENT_CREATED member letter not found!/ ] , 'SendReviewAlert triggered expected COMMENT_CREATED warnings.';
111
is( Koha::Notice::Messages->search->count, $nb_of_messages+1, 'SendReviewAlert lacking letter triggered nothing new.' );
112
71
$schema->storage->txn_rollback;
113
$schema->storage->txn_rollback;
72
114
73
1;
115
1;
74
- 

Return to bug 1985