emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/ebdb d86eedbf7c 2/3: Basic implementation of mailing li


From: Eric Abrahamsen
Subject: [elpa] externals/ebdb d86eedbf7c 2/3: Basic implementation of mailing list record type
Date: Thu, 12 Jan 2023 12:19:58 -0500 (EST)

branch: externals/ebdb
commit d86eedbf7c1b41229c9fee65e8f82be026a128cf
Author: Eric Abrahamsen <eric@ericabrahamsen.net>
Commit: Eric Abrahamsen <eric@ericabrahamsen.net>

    Basic implementation of mailing list record type
    
    * ebdb.el (ebdb-record-mailing-list): It now has slots!
    (ebdb-read, ebdb-string): And the basic methods.
    (ebdb-record-mail): This is now a generic function, which it should
    have been all along, so that different record classes can return their
    own mail addresses.
---
 ebdb-com.el |   8 ++++-
 ebdb.el     | 103 ++++++++++++++++++++++++++++++++++++++++++++++++++----------
 2 files changed, 94 insertions(+), 17 deletions(-)

diff --git a/ebdb-com.el b/ebdb-com.el
index d1bf15cffa..27bf1fdf1f 100644
--- a/ebdb-com.el
+++ b/ebdb-com.el
@@ -128,7 +128,8 @@ create roles for those records, etc."
   :group 'faces)
 
 (defcustom ebdb-name-face-alist '((ebdb-record-person . ebdb-person-name)
-                                 (ebdb-record-organization . 
ebdb-organization-name))
+                                 (ebdb-record-organization . 
ebdb-organization-name)
+                                 (ebdb-record-mailing-list . 
ebdb-mailing-list-name))
   "Alist of record class types to the face names.
 Faces are used to font-lock their names in the *EBDB* buffer."
   :type '(repeat (cons (ebdb-record :tag "Record type") (face :tag "Face"))))
@@ -143,6 +144,11 @@ Faces are used to font-lock their names in the *EBDB* 
buffer."
   "Face used for EBDB organization names."
   :group 'ebdb-faces)
 
+(defface ebdb-mailing-list-name
+  '((t (:inherit font-lock-constant-face)))
+  "Face used for EBDB mailing list names."
+  :group 'ebdb-faces)
+
 (defface ebdb-marked
   '((t (:background "LightBlue")))
   "Face used for currently-marked records."
diff --git a/ebdb.el b/ebdb.el
index 870284545a..568a8f4fdd 100644
--- a/ebdb.el
+++ b/ebdb.el
@@ -3915,16 +3915,73 @@ instances to add as part of the role."
     (ebdb-record-insert-field record role 'organizations)
     (ebdb-init-field role record)))
 
-(defclass ebdb-record-mailing-list (ebdb-record eieio-named)
+(defclass ebdb-record-mailing-list (ebdb-record)
   ((name
     :type ebdb-field-name-simple
     :initarg :name
+    :initform nil)
+   (id
+    :type ebdb-field-domain
+    :initarg :id
+    :initform nil)
+   (posting-address
+    :type ebdb-field-mail
+    :initarg :posting-address
+    :initform nil)
+   (unsubscribe-address
+    :type ebdb-field-mail
+    :initarg :unsubscribe-address
+    :initform nil)
+   (unsubscribe-url
+    :type ebdb-field-url
+    :initarg :unsubscribe-url
+    :initform nil)
+   (user-address
+    :type ebdb-field-mail
+    :initarg :user-address
+    :initform nil)
+   (archive-url
+    :type ebdb-field-url
+    :initarg :archive-url
     :initform nil))
   :allow-nil-initform t
   :documentation "A record class representing a mailing list.")
 
-(cl-defmethod ebdb-read ((_class (subclass ebdb-record-mailing-list)) 
&optional _db _slots)
-  (error "Mailing list records haven't been implemented yet"))
+(cl-defmethod ebdb-read ((class (subclass ebdb-record-mailing-list)) &optional 
slots)
+  (let ((name (ebdb-read 'ebdb-field-name-simple))
+       (id (let ((ebdb-read-string-override "Mailing list id"))
+             (ebdb-read 'ebdb-field-domain)))
+
+       (posting-address
+        (let ((ebdb-read-string-override "Posting address"))
+          (ebdb-with-exit
+           (ebdb-read 'ebdb-field-mail))))
+
+       (user-address
+        (let ((ebdb-read-string-override "Address to post from"))
+          (ebdb-with-exit
+           (ebdb-read
+            'ebdb-field-mail nil
+            (ebdb-parse 'ebdb-field-mail user-mail-address)))))
+
+       (archive-url
+        (let ((ebdb-read-string-override "Archive URL"))
+          (ebdb-with-exit
+           (ebdb-read 'ebdb-field-url)))))
+    (setq slots (list :name name :id id :posting-address posting-address
+                     :user-address user-address :archive-url archive-url))
+    (cl-call-next-method class slots)))
+
+(cl-defmethod ebdb-init-record ((record ebdb-record-mailing-list))
+  (with-slots (name posting-address) record
+    (ebdb-init-field name record)
+    (ebdb-init-field posting-address record)))
+
+(cl-defmethod ebdb-string ((record ebdb-record-mailing-list))
+  (with-slots (name id) record
+    (if (and name id)
+       (concat name " " id)
+      (or name id))))
 
 ;;; Merging
 
@@ -4748,27 +4805,41 @@ If RECORDS are given, only search those records."
        (object-assoc label 'label phones)
       phones)))
 
-(defun ebdb-record-mail (record &optional no-roles label defunct)
+(cl-defgeneric ebdb-record-mail (record &optional no-roles label defunct)
   "Return a list of all RECORD's mail fields.
 If NO-ROLES is non-nil, exclude mail fields from RECORD's roles.
 If LABEL is a string, return the mail with that label.  If
 DEFUNCT is non-nil, also consider RECORD's defunct mail
-addresses.  Sort mails by descending priority."
-  (let ((mails (slot-value record 'mail)))
-    (when (and (null no-roles) (slot-exists-p record 'organizations))
-      (dolist (r (slot-value record 'organizations))
-       (when (and (slot-value r 'mail)
-                  (or defunct
-                      (null (slot-value r 'defunct))))
-         (push (slot-value r 'mail) mails))))
+addresses.  Sort mails by descending priority.")
+
+(cl-defmethod ebdb-record-mail :around ((record ebdb-record)
+                                       &optional no-roles label defunct)
+  (let ((found (cl-call-next-method)))
     (unless defunct
-      (setq mails
+      (setq found
            (seq-filter (lambda (m)
                          (null (eq (slot-value m 'priority) 'defunct)))
-                       mails)))
+                       found)))
     (if label
-       (object-assoc label 'label mails)
-      (sort (copy-sequence mails) #'ebdb-field-compare))))
+       (object-assoc label 'label found)
+      (sort (copy-sequence found) #'ebdb-field-compare))))
+
+(cl-defmethod ebdb-record-mail :around ((record ebdb-record-entity)
+                                       &optional _no-roles _label _defunct)
+  (let ((found (cl-call-next-method)))
+    (append found (slot-value record 'mail))))
+
+(cl-defmethod ebdb-record-mail ((_record ebdb-record-organization)
+                               &optional _no-roles _label _defunct)
+  nil)
+
+(cl-defmethod ebdb-record-mail ((record ebdb-record-person))
+  (delete nil (mapcar (lambda (role) (slot-value role 'mail))
+                     (slot-value record 'organizations))))
+
+(cl-defmethod ebdb-record-mail ((record ebdb-record-mailing-list)
+                               &optional _no-roles _label _defunct)
+  (slot-value record 'posting-address))
 
 
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]