organization.ex (2019B)
1 # Zenflows is designed to implement the Valueflows vocabulary, 2 # written and maintained by srfsh <info@dyne.org>. 3 # Copyright (C) 2021-2023 Dyne.org foundation <foundation@dyne.org>. 4 # 5 # This program is free software: you can redistribute it and/or modify 6 # it under the terms of the GNU Affero General Public License as published by 7 # the Free Software Foundation, either version 3 of the License, or 8 # (at your option) any later version. 9 # 10 # This program is distributed in the hope that it will be useful, 11 # but WITHOUT ANY WARRANTY; without even the implied warranty of 12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 # GNU Affero General Public License for more details. 14 # 15 # You should have received a copy of the GNU Affero General Public License 16 # along with this program. If not, see <https://www.gnu.org/licenses/>. 17 18 defmodule Zenflows.VF.Organization do 19 @moduledoc "A formal or informal group, or legal organization." 20 21 use Zenflows.DB.Schema 22 23 alias Ecto.Changeset 24 alias Zenflows.DB.{Schema, Validate} 25 alias Zenflows.File 26 alias Zenflows.VF.SpatialThing 27 28 @type t() :: %__MODULE__{ 29 type: :org, 30 name: String.t(), 31 images: [File.t()], 32 note: String.t() | nil, 33 primary_location: SpatialThing.t() | nil, 34 classified_as: [String.t()] | nil, 35 updated_at: DateTime.t(), 36 } 37 38 schema "vf_agent" do 39 field :type, Ecto.Enum, values: [:org], default: :org 40 field :name, :string 41 has_many :images, File, foreign_key: :agent_id 42 field :note, :string 43 belongs_to :primary_location, SpatialThing 44 field :classified_as, {:array, :string} 45 timestamps() 46 end 47 48 @reqr [:name] 49 @cast @reqr ++ ~w[classified_as note primary_location_id]a 50 51 @doc false 52 @spec changeset(Schema.t(), Schema.params()) :: Changeset.t() 53 def changeset(schema \\ %__MODULE__{}, params) do 54 schema 55 |> Changeset.cast(params, @cast) 56 |> Changeset.validate_required(@reqr) 57 |> Validate.name(:name) 58 |> Validate.note(:note) 59 |> Changeset.cast_assoc(:images) 60 |> Validate.class(:classified_as) 61 |> Changeset.assoc_constraint(:primary_location) 62 end 63 end