liquid_feedback_core

changeset 79:0758a2e02620

implement auto_support and delegation checks

* users can put their support in auto_support mode that supports every new draft text, this is automaticly done for the author of the draft.
* enforce that new delegations cannot be done set on inactive members.
* delete also incomming delegations on delete of a user.
author Daniel Poelzleithner <poelzi@poelzi.org>
date Thu Oct 07 19:45:12 2010 +0200 (2010-10-07)
parents 4fc1779a9c98
children ca13b2614d10
files core.sql update/core-update.v1.2.8-v1.2.9.sql
line diff
     1.1 --- a/core.sql	Mon Oct 04 14:24:29 2010 +0200
     1.2 +++ b/core.sql	Thu Oct 07 19:45:12 2010 +0200
     1.3 @@ -614,6 +614,7 @@
     1.4          "initiative_id"         INT4,
     1.5          "member_id"             INT4,
     1.6          "draft_id"              INT8            NOT NULL,
     1.7 +        "auto_support"          BOOLEAN         NOT NULL DEFAULT 'f',
     1.8          FOREIGN KEY ("issue_id", "member_id") REFERENCES "interest" ("issue_id", "member_id") ON DELETE CASCADE ON UPDATE CASCADE,
     1.9          FOREIGN KEY ("initiative_id", "draft_id") REFERENCES "draft" ("initiative_id", "id") ON DELETE CASCADE ON UPDATE CASCADE );
    1.10  CREATE INDEX "supporter_member_id_idx" ON "supporter" ("member_id");
    1.11 @@ -622,6 +623,23 @@
    1.12  
    1.13  COMMENT ON COLUMN "supporter"."draft_id" IS 'Latest seen draft, defaults to current draft of the initiative (implemented by trigger "default_for_draft_id")';
    1.14  
    1.15 +CREATE FUNCTION update_supporter_drafts()
    1.16 +  RETURNS trigger
    1.17 +  LANGUAGE 'plpgsql' AS $$
    1.18 +  BEGIN
    1.19 +    UPDATE supporter SET draft_id = NEW.id 
    1.20 +    WHERE initiative_id = NEW.initiative_id AND
    1.21 +          (auto_support = 't' OR member_id = NEW.author_id);
    1.22 +    RETURN new;
    1.23 +  END
    1.24 +$$;
    1.25 +
    1.26 +CREATE TRIGGER "update_draft_supporter"
    1.27 +  AFTER INSERT ON "draft"
    1.28 +  FOR EACH ROW EXECUTE PROCEDURE
    1.29 +  update_supporter_drafts();
    1.30 +
    1.31 +COMMENT ON FUNCTION "update_supporter_drafts"() IS 'Automaticly update the supported draft_id to the latest version when auto_support is enabled';
    1.32  
    1.33  CREATE TABLE "opinion" (
    1.34          "initiative_id"         INT4            NOT NULL,
    1.35 @@ -668,6 +686,26 @@
    1.36  COMMENT ON COLUMN "delegation"."area_id"  IS 'Reference to area, if delegation is area-wide, otherwise NULL';
    1.37  COMMENT ON COLUMN "delegation"."issue_id" IS 'Reference to issue, if delegation is issue-wide, otherwise NULL';
    1.38  
    1.39 +CREATE FUNCTION "check_delegation"()
    1.40 +  RETURNS TRIGGER
    1.41 +  LANGUAGE 'plpgsql' VOLATILE AS $$
    1.42 +  BEGIN
    1.43 +    IF EXISTS (
    1.44 +      SELECT NULL FROM "member" WHERE 
    1.45 +        "id" = NEW."trustee_id" AND active = 'n'
    1.46 +    ) THEN
    1.47 +      RAISE EXCEPTION 'Cannot delegate to an inactive member';
    1.48 +    END IF;
    1.49 +    RETURN NEW;
    1.50 +  END;
    1.51 +$$;
    1.52 +
    1.53 +CREATE TRIGGER "update_delegation"
    1.54 +  BEFORE INSERT OR UPDATE ON "delegation"
    1.55 +  FOR EACH ROW EXECUTE PROCEDURE
    1.56 +  check_delegation();
    1.57 +
    1.58 +COMMENT ON FUNCTION "check_delegation"() IS 'Sanity checks for new delegation. Dont allow delegations to inactive members';
    1.59  
    1.60  CREATE TABLE "direct_population_snapshot" (
    1.61          PRIMARY KEY ("issue_id", "event", "member_id"),
    1.62 @@ -3377,6 +3415,7 @@
    1.63        DELETE FROM "suggestion_setting" WHERE "member_id" = "member_id_p";
    1.64        DELETE FROM "membership"         WHERE "member_id" = "member_id_p";
    1.65        DELETE FROM "delegation"         WHERE "truster_id" = "member_id_p";
    1.66 +      DELETE FROM "delegation"         WHERE "trustee_id" = "member_id_p";
    1.67        DELETE FROM "direct_voter" USING "issue"
    1.68          WHERE "direct_voter"."issue_id" = "issue"."id"
    1.69          AND "issue"."closed" ISNULL
     2.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     2.2 +++ b/update/core-update.v1.2.8-v1.2.9.sql	Thu Oct 07 19:45:12 2010 +0200
     2.3 @@ -0,0 +1,101 @@
     2.4 +BEGIN;
     2.5 + 
     2.6 +CREATE OR REPLACE VIEW "liquid_feedback_version" AS
     2.7 +  SELECT * FROM (VALUES ('1.2.9', 1, 2, 9))
     2.8 +  AS "subquery"("string", "major", "minor", "revision");
     2.9 +
    2.10 +
    2.11 +ALTER TABLE "supporter" ADD "auto_support" BOOLEAN NOT NULL DEFAULT 'f';
    2.12 +
    2.13 +CREATE FUNCTION update_supporter_drafts()
    2.14 +  RETURNS trigger
    2.15 +  LANGUAGE 'plpgsql' AS $$
    2.16 +  BEGIN
    2.17 +    UPDATE supporter SET draft_id = NEW.id 
    2.18 +    WHERE initiative_id = NEW.initiative_id AND
    2.19 +          (auto_support = 't' OR member_id = NEW.author_id);
    2.20 +    RETURN new;
    2.21 +  END
    2.22 +$$;
    2.23 +
    2.24 +COMMENT ON FUNCTION "update_supporter_drafts"() IS 'Automaticly update the supported draft_id to the latest version when auto_support is enabled';
    2.25 +
    2.26 +CREATE TRIGGER "update_draft_supporter"
    2.27 +  AFTER INSERT ON "draft"
    2.28 +  FOR EACH ROW EXECUTE PROCEDURE
    2.29 +  update_supporter_drafts();
    2.30 +
    2.31 +CREATE FUNCTION "check_delegation"()
    2.32 +  RETURNS TRIGGER
    2.33 +  LANGUAGE 'plpgsql' VOLATILE AS $$
    2.34 +  BEGIN
    2.35 +    IF EXISTS (
    2.36 +      SELECT NULL FROM "member" WHERE 
    2.37 +        "id" = NEW."trustee_id" AND active = 'n'
    2.38 +    ) THEN
    2.39 +      RAISE EXCEPTION 'Cannot delegate to an inactive member';
    2.40 +    END IF;
    2.41 +    RETURN NEW;
    2.42 +  END;
    2.43 +$$;
    2.44 +
    2.45 +CREATE TRIGGER "update_delegation"
    2.46 +  BEFORE INSERT OR UPDATE ON "delegation"
    2.47 +  FOR EACH ROW EXECUTE PROCEDURE
    2.48 +  check_delegation();
    2.49 +
    2.50 +CREATE OR REPLACE FUNCTION "delete_member"("member_id_p" "member"."id"%TYPE)
    2.51 +  RETURNS VOID
    2.52 +  LANGUAGE 'plpgsql' VOLATILE AS $$
    2.53 +    BEGIN
    2.54 +      UPDATE "member" SET
    2.55 +        "last_login"                   = NULL,
    2.56 +        "login"                        = NULL,
    2.57 +        "password"                     = NULL,
    2.58 +        "active"                       = FALSE,
    2.59 +        "notify_email"                 = NULL,
    2.60 +        "notify_email_unconfirmed"     = NULL,
    2.61 +        "notify_email_secret"          = NULL,
    2.62 +        "notify_email_secret_expiry"   = NULL,
    2.63 +        "notify_email_lock_expiry"     = NULL,
    2.64 +        "password_reset_secret"        = NULL,
    2.65 +        "password_reset_secret_expiry" = NULL,
    2.66 +        "organizational_unit"          = NULL,
    2.67 +        "internal_posts"               = NULL,
    2.68 +        "realname"                     = NULL,
    2.69 +        "birthday"                     = NULL,
    2.70 +        "address"                      = NULL,
    2.71 +        "email"                        = NULL,
    2.72 +        "xmpp_address"                 = NULL,
    2.73 +        "website"                      = NULL,
    2.74 +        "phone"                        = NULL,
    2.75 +        "mobile_phone"                 = NULL,
    2.76 +        "profession"                   = NULL,
    2.77 +        "external_memberships"         = NULL,
    2.78 +        "external_posts"               = NULL,
    2.79 +        "statement"                    = NULL
    2.80 +        WHERE "id" = "member_id_p";
    2.81 +      -- "text_search_data" is updated by triggers
    2.82 +      DELETE FROM "setting"            WHERE "member_id" = "member_id_p";
    2.83 +      DELETE FROM "setting_map"        WHERE "member_id" = "member_id_p";
    2.84 +      DELETE FROM "member_relation_setting" WHERE "member_id" = "member_id_p";
    2.85 +      DELETE FROM "member_image"       WHERE "member_id" = "member_id_p";
    2.86 +      DELETE FROM "contact"            WHERE "member_id" = "member_id_p";
    2.87 +      DELETE FROM "area_setting"       WHERE "member_id" = "member_id_p";
    2.88 +      DELETE FROM "issue_setting"      WHERE "member_id" = "member_id_p";
    2.89 +      DELETE FROM "initiative_setting" WHERE "member_id" = "member_id_p";
    2.90 +      DELETE FROM "suggestion_setting" WHERE "member_id" = "member_id_p";
    2.91 +      DELETE FROM "membership"         WHERE "member_id" = "member_id_p";
    2.92 +      DELETE FROM "delegation"         WHERE "truster_id" = "member_id_p";
    2.93 +      DELETE FROM "delegation"         WHERE "trustee_id" = "member_id_p";
    2.94 +      DELETE FROM "direct_voter" USING "issue"
    2.95 +        WHERE "direct_voter"."issue_id" = "issue"."id"
    2.96 +        AND "issue"."closed" ISNULL
    2.97 +        AND "member_id" = "member_id_p";
    2.98 +      RETURN;
    2.99 +    END;
   2.100 +  $$;
   2.101 +
   2.102 +COMMENT ON FUNCTION "delete_member"("member_id_p" "member"."id"%TYPE) IS 'Deactivate member and clear certain settings and data of this member (data protection)';
   2.103 +
   2.104 +COMMIT;

Impressum / About Us