tur-rms 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. #!/usr/bin/perl -w -CSDA
  2. use v5.14;
  3. use strict;
  4. use warnings;
  5. use utf8;
  6. use CGI::Fast qw/header param/;
  7. use CGI::Fast qw/Vars/;
  8. use Data::Dumper;
  9. use Email::Simple;
  10. use Email::Sender::Simple qw/sendmail/;
  11. use File::Slurp qw/append_file/;
  12. use JSON qw/encode_json/;
  13. use YAML::Any qw/Dump LoadFile/;
  14. use Fcntl qw/LOCK_EX LOCK_UN/;
  15. use List::Util qw/sum/;
  16. ##################################################
  17. # Inceput setari
  18. my %events = (
  19. chisinau => {
  20. data => 'luni, 2 iunie 2014, ora 10:00',
  21. locul => 'Facultatea de Calculatoare, Informatică și Microelectronică, Str. Studenților nr. 7, sectorul Rîșcani',
  22. sala => 'Aula 3-3 (bl. de studii 3, et. 2)',
  23. locuri => 180,
  24. pagina => 'http://ceata.org/evenimente/turul-echipelor-locale-stallman-chi%C8%99in%C4%83u.html',
  25. },
  26. valcea => {
  27. data => 'marți, 3 iunie 2014, ora 15:00',
  28. locul => 'Colegiul Național „Mircea cel Bătrân”, Str. Carol I nr. 41',
  29. sala => 'Sala de festivități (parter)',
  30. locuri => 120,
  31. pagina => 'http://ceata.org/evenimente/turul-echipelor-locale-stallman-v%C3%A2lcea.html',
  32. },
  33. cluj => {
  34. data => 'vineri, 6 iunie 2014, ora 10:00',
  35. locul => 'Facultate de Automatică și Calculatoare, UTCN, Str. Barițiu nr. 26-28',
  36. sala => 'Amfiteatrul D21',
  37. locuri => 150,
  38. pagina => 'http://ceata.org/evenimente/turul-echipelor-locale-stallman-cluj.html',
  39. }
  40. );
  41. use constant EMAIL_FROM => 'Turul echipelor locale ale Fundației Ceata cu Richard Stallman <tur-rms@ceata.org>';
  42. use constant ADMIN_EMAIL => 'tur-rms@ceata.org';
  43. use constant DATAFILE => 'date.yml';
  44. # Sfarsit setari
  45. ##################################################
  46. open LOCK, '<', DATAFILE;
  47. sub nr_participanti { my $oras = shift; sum 0, map { $_->{numar} } grep { $_->{oras} eq $oras } @_ }
  48. sub append{
  49. flock LOCK, LOCK_EX;
  50. eval {
  51. my $prenume = param('prenume') or die 'Nu ați completat prenumele';
  52. utf8::decode($prenume);
  53. my $nume = param('nume') // '';
  54. utf8::decode($nume);
  55. my $adresa = param('adresa') or die 'Nu ați completat adresa de poștă electronică';
  56. utf8::decode($adresa);
  57. my $oras = param('oras') or die 'Nu ați ales orașul cu evenimentul';
  58. die 'Fundația Ceata nu are încă o echipă locală în orașul ales' unless exists $events{$oras};
  59. my $numar = int param('numar') or die 'Nu ați ales numărul de participanți';
  60. die 'Numărul de participanți trebuie să fie între 1 și 5' unless $numar >= 1 && $numar <= 5;
  61. my $captcha = param('captcha') or die 'Nu ați completat câți ani împlinește în iunie proiectul Ceata';
  62. die 'Ați completat greșit vârsta proiectului Ceata' unless $captcha == 6;
  63. my $referinta = param('referinta') || param('referinta2');
  64. my $anunturi = param('anunturi') or 0;
  65. my @db = grep { $_->{oras} eq $oras } LoadFile DATAFILE;
  66. die 'Această adresă de poștă electronică este deja folosită' if grep { $_->{adresa} eq $adresa } @db;
  67. my $participanti = nr_participanti $oras, @db;
  68. die 'Nu sunt suficiente locuri libere' if $events{$oras}{locuri} < $participanti + $numar;
  69. my $entry = Dump {
  70. eveniment => $events{$oras},
  71. prenume => $prenume,
  72. nume => $nume,
  73. adresa => $adresa,
  74. oras => $oras,
  75. numar => $numar,
  76. referinta => $referinta,
  77. anunturi => defined($anunturi) && $anunturi ? 1 : 0,
  78. };
  79. append_file DATAFILE, $entry;
  80. utf8::decode($entry);
  81. my $success_email = Email::Simple->create(
  82. header => [
  83. To => "$nume <$adresa>",
  84. Subject => 'Confirmarea de înscriere la evenimentul local al Fundației Ceata cu Richard Stallman',
  85. From => EMAIL_FROM,
  86. ],
  87. body => "Aceasta este o confirmare automată de înscriere la unul din evenimentele locale ale Fundației Ceata cu Richard Stallman.\n\n$entry",
  88. );
  89. sendmail $success_email, { to => [$adresa, ADMIN_EMAIL]};
  90. };
  91. flock LOCK, LOCK_UN;
  92. if ($@) {
  93. my $eroare = $@ =~ s/ at .*//r;
  94. my $error_email = Email::Simple->create(
  95. header => [
  96. To => "Administrator <" . ADMIN_EMAIL . ">",
  97. Subject => 'Eroare de înscriere la unul din evenimentele locale ale Fundației Ceata cu Richard Stallman',
  98. From => EMAIL_FROM,
  99. ],
  100. body => "Eroare: $eroare\n" . Dumper scalar Vars,
  101. );
  102. sendmail $error_email;
  103. print header('text/html; charset=utf-8', '500 Internal Server Error');
  104. print $eroare;
  105. } else {
  106. print header('text/html; charset=utf-8');
  107. print 'Ați fost înscris cu succes';
  108. }
  109. }
  110. sub info{
  111. my $oras = param('oras');
  112. eval {
  113. die 'Eveniment inexistent' unless defined $oras && exists $events{$oras};
  114. my %out = %{$events{$oras}};
  115. my $participanti = nr_participanti $oras, LoadFile DATAFILE;
  116. $out{locuri} = $out{locuri} - $participanti;
  117. print header('application/json; charset=utf-8');
  118. print encode_json \%out;
  119. };
  120. if ($@) {
  121. $@ =~ s/ at .*//;
  122. print header('text/html; charset=utf-8', '500 Internal Server Error');
  123. print $@;
  124. }
  125. }
  126. sub view{
  127. my $oras = param('oras');
  128. unless (exists $events{$oras}) {
  129. print header('text/html; charset=utf-8', '500 Internal Server Error');
  130. print 'Acest eveniment nu există';
  131. return;
  132. }
  133. my @db = grep { $_->{oras} eq $oras } LoadFile DATAFILE;
  134. my $participanti = nr_participanti $oras, @db;
  135. print header('text/html; charset=utf-8');
  136. print "Sunt $participanti participanți înscriși<p>";
  137. # for my $p(@db) {
  138. # print "Nume: $p->{nume}<br>Prenume: $p->{prenume}<br>Adresa: $p->{adresa}<br>Oras: $p->{oras}<br>Numar: $p->{numar}<br>Anunturi: $p->{anunturi}<p>";
  139. # }
  140. }
  141. while (CGI::Fast->new) {
  142. my $op = param 'op' // '';
  143. append if $op eq 'append';
  144. info if $op eq 'info';
  145. view if $op eq 'view';
  146. }
  147. 1;
  148. __END__
  149. =head1 NAME
  150. zlp - Formular de înscriere la Ziua Libertății Programelor
  151. =head1 AUTHOR
  152. Marius Gavrilescu E<lt>marius@ieval.roE<gt>
  153. =head1 COPYRIGHT AND LICENSE
  154. Copyright (C) 2013 Fundația Ceata
  155. This program is free software: you can redistribute it and/or modify
  156. it under the terms of the GNU Affero General Public License as published by
  157. the Free Software Foundation, either version 3 of the License, or
  158. (at your option) any later version.
  159. This program is distributed in the hope that it will be useful,
  160. but WITHOUT ANY WARRANTY; without even the implied warranty of
  161. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  162. GNU Affero General Public License for more details.
  163. You should have received a copy of the GNU Affero General Public License
  164. along with this program. If not, see <http://www.gnu.org/licenses/>.
  165. =cut