rest of commission routes

This commit is contained in:
byte[] 2019-12-04 11:35:06 -05:00
parent ce4b1b1bcf
commit bbe7643174
15 changed files with 160 additions and 67 deletions

View file

@ -49,8 +49,8 @@ defmodule Philomena.Commissions do
{:error, %Ecto.Changeset{}} {:error, %Ecto.Changeset{}}
""" """
def create_commission(attrs \\ %{}) do def create_commission(user, attrs \\ %{}) do
%Commission{} Ecto.build_assoc(user, :commission)
|> Commission.changeset(attrs) |> Commission.changeset(attrs)
|> Repo.insert() |> Repo.insert()
end end

View file

@ -26,8 +26,56 @@ defmodule Philomena.Commissions.Commission do
def changeset(commission, attrs) do def changeset(commission, attrs) do
commission commission
|> cast(attrs, [:information, :contact, :will_create, :will_not_create, :open, :sheet_image_id, :categories]) |> cast(attrs, [:information, :contact, :will_create, :will_not_create, :open, :sheet_image_id, :categories])
|> validate_required([:user, :information, :contact, :open]) |> drop_blank_categories()
|> validate_required([:user_id, :information, :contact, :open])
|> validate_length(:information, max: 700, count: :bytes) |> validate_length(:information, max: 700, count: :bytes)
|> validate_length(:contact, max: 700, count: :bytes) |> validate_length(:contact, max: 700, count: :bytes)
|> validate_subset(:categories, Keyword.values(categories()))
end
defp drop_blank_categories(changeset) do
categories =
changeset
|> get_field(:categories)
|> Enum.filter(& &1 not in [nil, ""])
change(changeset, categories: categories)
end
def categories do
[
"Anthro": "Anthro",
"Canon Characters": "Canon Characters",
"Comics": "Comics",
"Fetish Art": "Fetish Art",
"Human and EqG": "Human and EqG",
"NSFW": "NSFW",
"Original Characters": "Original Characters",
"Original Species": "Original Species",
"Pony": "Pony",
"Requests": "Requests",
"Safe": "Safe",
"Shipping": "Shipping",
"Violence and Gore": "Violence and Gore"
]
end
def types do
[
"Sketch",
"Colored Sketch",
"Inked",
"Flat Color",
"Vector",
"Cel Shaded",
"Fully Shaded",
"Traditional",
"Pixel Art",
"Animation",
"Crafted Item",
"Sculpture",
"Plushie",
"Other"
]
end end
end end

View file

@ -1,6 +1,7 @@
defimpl Canada.Can, for: [Atom, Philomena.Users.User] do defimpl Canada.Can, for: [Atom, Philomena.Users.User] do
alias Philomena.Users.User alias Philomena.Users.User
alias Philomena.Comments.Comment alias Philomena.Comments.Comment
alias Philomena.Commissions.Commission
alias Philomena.Conversations.Conversation alias Philomena.Conversations.Conversation
alias Philomena.Images.Image alias Philomena.Images.Image
alias Philomena.Forums.Forum alias Philomena.Forums.Forum
@ -64,6 +65,9 @@ defimpl Canada.Can, for: [Atom, Philomena.Users.User] do
# View user links they've created # View user links they've created
def can?(%User{id: id}, :show, %UserLink{user_id: id}), do: true def can?(%User{id: id}, :show, %UserLink{user_id: id}), do: true
# Edit their commissions
def can?(%User{id: id}, action, %Commission{user_id: id}) when action in [:edit, :update, :delete], do: true
# View non-deleted images # View non-deleted images
def can?(_user, action, Image) def can?(_user, action, Image)
when action in [:new, :create, :index], when action in [:new, :create, :index],

View file

@ -42,6 +42,7 @@ defmodule PhilomenaWeb do
import PhilomenaWeb.ErrorHelpers import PhilomenaWeb.ErrorHelpers
import PhilomenaWeb.Gettext import PhilomenaWeb.Gettext
import PhoenixMTM.Helpers
alias PhilomenaWeb.Router.Helpers, as: Routes alias PhilomenaWeb.Router.Helpers, as: Routes
# Wrong way around for convenience # Wrong way around for convenience

View file

@ -18,7 +18,7 @@ defmodule PhilomenaWeb.Profile.CommissionController do
item_descriptions = item_descriptions =
commission.items commission.items
|> Enum.map(&%{body: &1.description}) |> Enum.map(&%{body: &1.description })
|> Renderer.render_collection(conn) |> Renderer.render_collection(conn)
item_add_ons = item_add_ons =
@ -29,10 +29,10 @@ defmodule PhilomenaWeb.Profile.CommissionController do
[information, contact, will_create, will_not_create] = [information, contact, will_create, will_not_create] =
Renderer.render_collection( Renderer.render_collection(
[ [
%{body: commission.information}, %{body: commission.information || ""},
%{body: commission.contact}, %{body: commission.contact || ""},
%{body: commission.will_create}, %{body: commission.will_create || ""},
%{body: commission.will_not_create} %{body: commission.will_not_create || ""}
], ],
conn conn
) )
@ -55,6 +55,49 @@ defmodule PhilomenaWeb.Profile.CommissionController do
render(conn, "new.html", changeset: changeset) render(conn, "new.html", changeset: changeset)
end end
def create(conn, %{"commission" => commission_params}) do
user = conn.assigns.current_user
case Commissions.create_commission(user, commission_params) do
{:ok, _commission} ->
conn
|> put_flash(:info, "Commission successfully created.")
|> redirect(to: Routes.profile_commission_path(conn, :show, user))
{:error, changeset} ->
render(conn, "new.html", changeset: changeset)
end
end
def edit(conn, _params) do
changeset = Commissions.change_commission(conn.assigns.user.commission)
render(conn, "edit.html", changeset: changeset)
end
def update(conn, %{"commission" => commission_params}) do
commission = conn.assigns.user.commission
case Commissions.update_commission(commission, commission_params) do
{:ok, _commission} ->
conn
|> put_flash(:info, "Commission successfully updated.")
|> redirect(to: Routes.profile_commission_path(conn, :show, conn.assigns.user))
{:error, changeset} ->
render(conn, "edit.html", changeset: changeset)
end
end
def delete(conn, _params) do
commission = conn.assigns.user.commission
{:ok, _commission} = Commissions.delete_commission(commission)
conn
|> put_flash(:info, "Commission deleted successfully.")
|> redirect(to: Routes.commission_path(conn, :index))
end
defp ensure_commission(conn, _opts) do defp ensure_commission(conn, _opts) do
case is_nil(conn.assigns.user.commission) do case is_nil(conn.assigns.user.commission) do
true -> PhilomenaWeb.NotFoundPlug.call(conn) true -> PhilomenaWeb.NotFoundPlug.call(conn)

View file

@ -1,38 +1,3 @@
elixir:
categories = [
"Anthro": :category_anthro,
"Canon Characters": :category_canon_characters,
"Comics": :category_comics,
"Fetish Art": :category_fetish_art,
"Human and EqG": :category_human_and_eqg,
"NSFW": :category_nsfw,
"Original Characters": :category_original_characters,
"Original Species": :category_original_species,
"Pony": :category_pony,
"Requests": :category_requests,
"Safe": :category_safe,
"Shipping": :category_shipping,
"Violence and Gore": :category_violence_and_gore
]
types = [
[key: "-", value: ""],
"Sketch",
"Colored Sketch",
"Inked",
"Flat Color",
"Vector",
"Cel Shaded",
"Fully Shaded",
"Traditional",
"Pixel Art",
"Animation",
"Crafted Item",
"Sculpture",
"Plushie",
"Other"
]
.block .block
.block__header .block__header
span.block__header__title Search span.block__header__title Search
@ -40,7 +5,7 @@ elixir:
= form_for @conn, Routes.commission_path(@conn, :index), [as: :commission, method: "get", class: "hform"], fn f -> = form_for @conn, Routes.commission_path(@conn, :index), [as: :commission, method: "get", class: "hform"], fn f ->
.field = label f, :categories, "Art Categories:" .field = label f, :categories, "Art Categories:"
= for {name, value} <- categories do = for {name, value} <- categories() do
.field .field
=> checkbox f, value, checked_value: name, name: "commission[category][]", class: "checkbox spacing-right", hidden_input: false => checkbox f, value, checked_value: name, name: "commission[category][]", class: "checkbox spacing-right", hidden_input: false
=> label f, value, name => label f, value, name
@ -48,7 +13,7 @@ elixir:
br br
.field = label f, :item_type, "Commission Type:" .field = label f, :item_type, "Commission Type:"
.field = select f, :item_type, types, class: "input" .field = select f, :item_type, types(), class: "input"
br br

View file

@ -5,30 +5,34 @@
.field .field
=> label f, :information, "General Information:" => label f, :information, "General Information:"
= textarea f, :information, class: "input input--wide input--text", placeholder: "A general overview about your commissions." = textarea f, :information, class: "input input--wide input--text", placeholder: "A general overview about your commissions.", required: true
= error_tag f, :information
.field .field
=> label f, :contact, "Contact Information:" => label f, :contact, "Contact Information:"
= textarea f, :contact, class: "input input--wide input--text", placeholder: "How you would like potential customers to contact you (PM, Discord, Email, etc). Remember that this information will be publicly visible." = textarea f, :contact, class: "input input--wide input--text", placeholder: "How you would like potential customers to contact you (PM, Discord, Email, etc). Remember that this information will be publicly visible.", required: true
= error_tag f, :contact
.field .field
=> label f, :will_create, "Content you are particularly interested in drawing or creating (optional):" => label f, :will_create, "Content you are particularly interested in drawing or creating (optional):"
= textarea f, :will_create, class: "input input--wide input--text", placeholder: "List specific content you are willing to accept commissions for." = textarea f, :will_create, class: "input input--wide input--text", placeholder: "List specific content you are willing to accept commissions for."
= error_tag f, :will_create
.field .field
=> label f, :will_not_create, "Content you will not draw or create (optional):" => label f, :will_not_create, "Content you will not draw or create (optional):"
= textarea f, :will_not_create, class: "input input--wide input--text", placeholder: "List specific content you are not willing to accept commissions for." = textarea f, :will_not_create, class: "input input--wide input--text", placeholder: "List specific content you are not willing to accept commissions for."
= error_tag f, :will_not_create
.field .field
=> label f, :categories, "Art Categories:" => label f, :categories, "Art Categories:"
br br
/= f.collection_check_boxes :categories, Commission::CATEGORIES.sort_by(&:downcase), :itself, :itself do |b| = collection_checkboxes f, :categories, categories(), wrapper: &Phoenix.HTML.Tag.content_tag(:span, &1, class: "commission__category")
span.commission__category = error_tag f, :categories
=> b.label
= b.check_box
.field .field
=> label f, :sheet_image_id, "Image ID of your commissions sheet (optional but recommended):" => label f, :sheet_image_id, "Image ID of your commissions sheet (optional but recommended):"
br br
= number_input f, :sheet_image_id, class: "input", placeholder: "1227409" = number_input f, :sheet_image_id, class: "input", placeholder: "1227409"
= error_tag f, :sheet_image_id
.field .field
= label f, :open, "Currently accepting commissions." do = label f, :open, "Currently accepting commissions." do
=> checkbox f, :open, class: "checkbox" => checkbox f, :open, class: "checkbox"
= error_tag f, :open
br br
= submit "Save", class: "button" = submit "Save", class: "button"

View file

@ -3,6 +3,14 @@
span.block__header__title Available Items and Prices span.block__header__title Available Items and Prices
.block__content .block__content
= if not Enum.any?(@commission.items) do
= if current?(@user, @conn.assigns.current_user) do
p You have not added any items to your commissions sheet yet.
p Your listing will not appear in search results until you list at least one item.
- else
p This artist has not added any items yet. Please check back later.
table.table table.table
thead thead
tr tr

View file

@ -12,6 +12,7 @@
br br
= if Enum.any?(@commission.items) do
strong> Price Range: strong> Price Range:
- {min, max} = Enum.min_max_by(@commission.items, & &1.base_price) - {min, max} = Enum.min_max_by(@commission.items, & &1.base_price)
| $ | $
@ -65,16 +66,16 @@
= render partial: 'profiles/user_link_area' = render partial: 'profiles/user_link_area'
/ Options block / Options block
/.block .block
.block__header .block__header
span.block__header__title Options span.block__header__title Options
.block__content .block__content
- if can? :edit, @user.commission = if can?(@conn, :edit, @commission) do
= link_to 'Edit this listing', edit_commission_path(@user.commission) = link "Edit this listing", to: Routes.profile_commission_path(@conn, :edit, @user)
br br
= link_to 'Delete this listing', commission_path(@user.commission), data: { confirm: t('commissions.confirm_delete_listing') }, method: :delete = link "Delete this listing", to: Routes.profile_commission_path(@conn, :delete, @user), data: [confirm: "Are you really, really sure about that?", method: :delete]
br br
= link_to 'Report this listing', new_report_path(reportable_class: 'commission', reportable_id: @user.commission.id) /= link_to 'Report this listing', new_report_path(reportable_class: 'commission', reportable_id: @user.commission.id)
/ Share block / Share block
.block .block

View file

@ -0,0 +1,5 @@
h1 Edit Commission Listing
p
= link "Back to commission", to: Routes.profile_commission_path(@conn, :show, @user)
= render PhilomenaWeb.Profile.CommissionView, "_form.html", changeset: @changeset, action: Routes.profile_commission_path(@conn, :update, @user), conn: @conn

View file

@ -6,13 +6,13 @@ h1
/ Side column / Side column
.column-layout__left .column-layout__left
= render PhilomenaWeb.Profile.CommissionView, "_listing_sidebar.html", commission: @commission, rendered: @rendered, conn: @conn = render PhilomenaWeb.Profile.CommissionView, "_listing_sidebar.html", commission: @commission, user: @user, rendered: @rendered, conn: @conn
/ Main column / Main column
.column-layout__main .column-layout__main
/ Commission sheet block / Commission sheet block
= render PhilomenaWeb.Profile.CommissionView, "_listing_sheet.html", commission: @commission, conn: @conn = render PhilomenaWeb.Profile.CommissionView, "_listing_sheet.html", commission: @commission, user: @user, conn: @conn
/ Types and prices block / Types and prices block
= render PhilomenaWeb.Profile.CommissionView, "_listing_items.html", commission: @commission, items: @items, conn: @conn = render PhilomenaWeb.Profile.CommissionView, "_listing_items.html", commission: @commission, user: @user, items: @items, conn: @conn

View file

@ -1,3 +1,8 @@
defmodule PhilomenaWeb.CommissionView do defmodule PhilomenaWeb.CommissionView do
use PhilomenaWeb, :view use PhilomenaWeb, :view
alias Philomena.Commissions.Commission
def categories, do: [[key: "-", value: ""] | Commission.categories()]
def types, do: Commission.types()
end end

View file

@ -1,3 +1,10 @@
defmodule PhilomenaWeb.Profile.CommissionView do defmodule PhilomenaWeb.Profile.CommissionView do
use PhilomenaWeb, :view use PhilomenaWeb, :view
alias Philomena.Commissions.Commission
def categories, do: Commission.categories()
def current?(%{id: id}, %{id: id}), do: true
def current?(_user1, _user2), do: false
end end

View file

@ -59,7 +59,8 @@ defmodule Philomena.MixProject do
{:bamboo, "~> 1.2"}, {:bamboo, "~> 1.2"},
{:bamboo_smtp, "~> 1.7"}, {:bamboo_smtp, "~> 1.7"},
{:remote_ip, "~> 0.2.0"}, {:remote_ip, "~> 0.2.0"},
{:briefly, "~> 0.3.0"} {:briefly, "~> 0.3.0"},
{:phoenix_mtm, "~> 1.0.0"}
] ]
end end

View file

@ -39,6 +39,7 @@
"phoenix_ecto": {:hex, :phoenix_ecto, "4.0.0", "c43117a136e7399ea04ecaac73f8f23ee0ffe3e07acfcb8062fe5f4c9f0f6531", [:mix], [{:ecto, "~> 3.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.9", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm"}, "phoenix_ecto": {:hex, :phoenix_ecto, "4.0.0", "c43117a136e7399ea04ecaac73f8f23ee0ffe3e07acfcb8062fe5f4c9f0f6531", [:mix], [{:ecto, "~> 3.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.9", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm"},
"phoenix_html": {:hex, :phoenix_html, "2.13.3", "850e292ff6e204257f5f9c4c54a8cb1f6fbc16ed53d360c2b780a3d0ba333867", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm"}, "phoenix_html": {:hex, :phoenix_html, "2.13.3", "850e292ff6e204257f5f9c4c54a8cb1f6fbc16ed53d360c2b780a3d0ba333867", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm"},
"phoenix_live_reload": {:hex, :phoenix_live_reload, "1.2.1", "274a4b07c4adbdd7785d45a8b0bb57634d0b4f45b18d2c508b26c0344bd59b8f", [:mix], [{:file_system, "~> 0.2.1 or ~> 0.3", [hex: :file_system, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.4", [hex: :phoenix, repo: "hexpm", optional: false]}], "hexpm"}, "phoenix_live_reload": {:hex, :phoenix_live_reload, "1.2.1", "274a4b07c4adbdd7785d45a8b0bb57634d0b4f45b18d2c508b26c0344bd59b8f", [:mix], [{:file_system, "~> 0.2.1 or ~> 0.3", [hex: :file_system, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.4", [hex: :phoenix, repo: "hexpm", optional: false]}], "hexpm"},
"phoenix_mtm": {:hex, :phoenix_mtm, "1.0.0", "36a2292f84f0712aa4fa029cb6618d9388371d70951b0269bdf372df576aab56", [:mix], [{:ecto, "~> 3.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:ecto_sql, "~> 3.0", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.0", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:postgrex, ">= 0.0.0", [hex: :postgrex, repo: "hexpm", optional: true]}], "hexpm"},
"phoenix_pubsub": {:hex, :phoenix_pubsub, "1.1.2", "496c303bdf1b2e98a9d26e89af5bba3ab487ba3a3735f74bf1f4064d2a845a3e", [:mix], [], "hexpm"}, "phoenix_pubsub": {:hex, :phoenix_pubsub, "1.1.2", "496c303bdf1b2e98a9d26e89af5bba3ab487ba3a3735f74bf1f4064d2a845a3e", [:mix], [], "hexpm"},
"phoenix_slime": {:hex, :phoenix_slime, "0.12.0", "0d5f2b600b8a69dad361a987fdfc836bc71cdce373ce11abade4f6548880f0bf", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.4", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.10", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:slime, "~> 1.0", [hex: :slime, repo: "hexpm", optional: false]}], "hexpm"}, "phoenix_slime": {:hex, :phoenix_slime, "0.12.0", "0d5f2b600b8a69dad361a987fdfc836bc71cdce373ce11abade4f6548880f0bf", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.4", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.10", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:slime, "~> 1.0", [hex: :slime, repo: "hexpm", optional: false]}], "hexpm"},
"plug": {:hex, :plug, "1.8.3", "12d5f9796dc72e8ac9614e94bda5e51c4c028d0d428e9297650d09e15a684478", [:mix], [{:mime, "~> 1.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm"}, "plug": {:hex, :plug, "1.8.3", "12d5f9796dc72e8ac9614e94bda5e51c4c028d0d428e9297650d09e15a684478", [:mix], [{:mime, "~> 1.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm"},