]> nos-oignons.net Git - gestion-adh.git/commitdiff
Finish implenting update-ag-subscribers
authorLunar <lunar@anargeek.net>
Sat, 1 Jun 2013 22:26:35 +0000 (00:26 +0200)
committerLunar <lunar@anargeek.net>
Sun, 2 Jun 2013 08:27:13 +0000 (10:27 +0200)
README
bin/update-ag-subscribers
features/step_definitions/subscriptions.rb
features/support/mock_mailman/sudo [new file with mode: 0755]
features/update-ag-subscribers.feature
lib/nos_oignons/mailman.rb

diff --git a/README b/README
index bc73c094bfa0bf0209b510c0bfa55179d596a67d..984d91491c14264bf98d8d386cea9ddeec6e4f9a 100644 (file)
--- a/README
+++ b/README
@@ -83,6 +83,14 @@ des informations invalides dans la base des membres. Il doit être configuré da
 le dépôt central du wiki du C.A. (via un lien symbolique dans
 `.git/hooks/pre-receive`).
 
+update-ag-subscribers
+---------------------
+
+Met à jour la liste des emails inscrites à la liste ag@ par rapport aux membres
+à jour de cotisation. À exécuter à travers un *cron*. A besoin de pouvoir
+lancer les commandes `list_members`, `add_members` et `remove_members` via
+`sudo` sur le compte `list`.
+
 Développement
 =============
 
@@ -112,3 +120,6 @@ Installer les dépendences :
 
 Il faut ensuite mettre en place le lien symbolique vers le script
 `pre-receive-hooks`. XXX: à détailler
+
+XXX: configuration sudoers
+XXX: crontab pour update-ag-subscribers
index e5580c271fd86828173a865c1f1c234d07eea1d6..f10978ebc0fb26a5c657a4d6f722e48bf4a49281 100755 (executable)
@@ -7,3 +7,11 @@ Bundler.setup
 
 require 'nos_oignons/mailman'
 require 'nos_oignons/subscriptions'
+
+LIST = 'ag'
+
+current_emails = NosOignons::Mailman.list_members(LIST)
+uptodate_emails = NosOignons::Subscription.all.select(&:up_to_date?).collect(&:email)
+
+NosOignons::Mailman.add_members(LIST, uptodate_emails - current_emails)
+NosOignons::Mailman.remove_members(LIST, current_emails - uptodate_emails)
index a4827f51ca8446c6228a503605f353487e58ad21..dd1815130ec4a04f8ebea3e5a682bee037178769 100644 (file)
@@ -23,6 +23,17 @@ Given /^(?:une base )?avec (\w+)(, à jour de cotisation| qui n'a pas payé sa c
   write_file file, render_subscription_file(data)
 end
 
+Given /^une nouvelle adhésion de (\w+)$/ do |name|
+  data = { 'name' => name,
+           'address' => "At #{name}",
+           'email' => "#{name.downcase}@example.org",
+           'membership_fee_paid_on' => Time.now.strftime('%Y-%m-%d')
+         }
+  create_dir 'Membres'
+  file = subscription_filename_for_id(new_id)
+  write_file file, render_subscription_file(data)
+end
+
 When /^j'ajoute une fiche correcte pour une nouvelle adhésion$/ do
   @file = subscription_filename_for_id(new_id)
   write_file @file, render_subscription_file(EXTRA_SUBSCRIPTION)
diff --git a/features/support/mock_mailman/sudo b/features/support/mock_mailman/sudo
new file mode 100755 (executable)
index 0000000..a0ac546
--- /dev/null
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+if ! [ "-u" = "$1" ] && ! [ "list" = "$2" ]; then
+       echo "Bad call" >&2
+       exit 1
+fi
+
+shift 2
+
+exec "$@"
index 0ca89aa543229068a4e8b1b932f0fe5add415ba1..4ee9725232d2145d032ef8e22db0b191cd0a7cd3 100644 (file)
@@ -54,10 +54,25 @@ Fonctionnalité: mettre à jour les emails inscrites à la liste ag@
     Et une base avec Pierre, à jour de cotisation
     Et avec Jane qui n'a pas payé sa cotisation cette année
     Et avec Fatima, à jour de cotisation
-    Et une nouvelle adhésion de Sean
     Lorsque j'exécute update-ag-subscribers
     Alors la liste ag@ doit avoir comme emails inscrits:
       """
       pierre@example.org
       fatima@example.org
       """
+
+  Scénario: Un ajout et une suppression
+    Soit une liste ag@ avec comme emails inscrits:
+      """
+      pierre@example.org
+      jane@example.org
+      """
+    Et une base avec Pierre, à jour de cotisation
+    Et avec Jane qui n'a pas payé sa cotisation cette année
+    Et une nouvelle adhésion de Sean
+    Lorsque j'exécute update-ag-subscribers
+    Alors la liste ag@ doit avoir comme emails inscrits:
+      """
+      pierre@example.org
+      sean@example.org
+      """
index 501b5429ade1d685c193cda0f15df341b2abba11..9c0d590dd8c30149c07b2aa70480ac35747b8492 100644 (file)
@@ -6,7 +6,7 @@ module NosOignons
   module Mailman
     class << self
       def list_members(list)
-        `list_members #{Shellwords.escape(list)}`.split
+        `sudo -u list list_members #{Shellwords.escape(list)}`.strip.split
       end
 
       def add_member(list, email)
@@ -14,8 +14,23 @@ module NosOignons
       end
 
       def add_members(list, emails)
-        # XXX IO.popen 
-        `add_members #{Shellwords.escape(list)}`.split
+        IO.popen(['sudo', '-u', 'list', 'add_members', '-r', '-', list], 'w') do |io|
+          emails.each do |email|
+            io.puts email
+          end
+        end
+      end
+
+      def remove_member(list, email)
+        remove_members(list, [email])
+      end
+
+      def remove_members(list, emails)
+        IO.popen(['sudo', '-u', 'list', 'remove_members', '-f', '-', list], 'w') do |io|
+          emails.each do |email|
+            io.puts email
+          end
+        end
       end
     end
   end