fix profile generation

This commit is contained in:
Torsten 2023-01-16 01:11:05 +02:00
parent 4ffc6e3c85
commit 63299d4464
14 changed files with 114 additions and 56 deletions

View File

@ -12,7 +12,9 @@ class ProfilesController < ApplicationController
# GET /profiles/new
def new
@profile = Profile.new
kind = params[:kind]
kind = Profile.types.first unless Profile.types.include?(kind)
@profile = Profile.new kind: kind
end
# GET /profiles/1/edit
@ -26,7 +28,7 @@ class ProfilesController < ApplicationController
@profile.member = current_member
if @profile.save
redirect_to @profile, notice: "Successfully created Profile profile"
redirect_to member_path(current_member), notice: "Successfully created #{@profile.Kind} profile"
else
render :new, status: :unprocessable_entity
end
@ -36,7 +38,7 @@ class ProfilesController < ApplicationController
def update
authorize @profile
if @profile.update(profile_params)
redirect_to @profile, notice: "Profile Profile was updated."
redirect_to member_path(current_member), notice: "#{@profile.Kind} profile was updated."
else
render :edit, status: :unprocessable_entity
end
@ -46,7 +48,7 @@ class ProfilesController < ApplicationController
def destroy
authorize @profile
@profile.destroy
redirect_to profiles_url, notice: "Profile was successfully destroyed."
redirect_to member_path(current_member), notice: "#{@profile.Kind} profile was successfully destroyed."
end
private
@ -57,6 +59,6 @@ class ProfilesController < ApplicationController
# Only allow a list of trusted parameters through.
def profile_params
params.require(:profile).permit(:name, :bio, :picture)
params.require(:profile).permit(:name, :bio, :picture, :kind)
end
end

View File

@ -7,7 +7,16 @@ class Member < ApplicationRecord
mount_uploader :picture, PictureUploader
has_many :entities
has_one :profile
has_many :profiles
Profile.types.each do |kind|
define_method :kind do
Profile.where( member_id: self.id).where(kind: kind).first
end
end
def profile( kind )
Profile.where( member_id: self.id).where(kind: kind).first
end
def admin?
email == "torsten@villataika.fi"

View File

@ -8,4 +8,11 @@ class Profile < ApplicationRecord
mount_uploader :picture, PictureUploader
def self.types
["member" , "artist" , "teacher"]
end
def Kind
self.kind.capitalize
end
end

View File

@ -0,0 +1,10 @@
# allows to edit/detroy own data
# which can be viewed by anyone
class EditOwnPolicy < ApplicationPolicy
def edit?
(member == record.member) or member.admin?
end
alias :update? :edit?
alias :destroy? :edit?
end

View File

@ -0,0 +1,6 @@
class MemberPolicy < EditOwnPolicy
class Scope < Scope
end
end

View File

@ -1,9 +1,4 @@
class ProfilePolicy < ApplicationPolicy
class ProfilePolicy < EditOwnPolicy
def edit?
(member == record.member) or member.admin?
end
alias :update? :edit?
alias :destroy? :edit?
end

View File

@ -3,7 +3,7 @@
%a.block.rounded-lg.px-4.py-2.text-sm.text-gray-500.hover:bg-gray-50.hover:text-gray-700{:href => "/forum", :role => "menuitem"}
Forum
%a.block.rounded-lg.px-4.py-2.text-sm.text-gray-500.hover:bg-gray-50.hover:text-gray-700{:href => main_app.member_path(current_member), :role => "menuitem"}
Profile
Settings
- unless Rails.env.production?
- if current_member.admin?
%a.block.rounded-lg.px-4.py-2.text-sm.text-gray-500.hover:bg-gray-50.hover:text-gray-700{:href => merged.pages_path(), :role => "menuitem"}

View File

@ -1,42 +1,41 @@
.px-4.py-16.mx-auto.sm:max-w-xl.md:max-w-full.lg:max-w-screen-xl.md:px-24.lg:px-8.lg:py-20
.flex.flex-col.max-w-screen-lg.overflow-hidden.bg-white.border.rounded.shadow-sm.lg:flex-row.sm:mx-auto
.relative{:class => "lg:w-1/2"}
-if @member.picture_url
= image_tag @member.picture_url, class: "object-cover w-full lg:absolute h-80 lg:h-full"
.flex.flex-col.justify-center.p-8.lg:p-16.lg:pl-10{:class => "lg:w-1/2"}
%div
%p.inline-block.px-3.py-px.mb-4.text-xs.font-semibold.tracking-wider.text-teal-900.uppercase.rounded-full.bg-teal-accent-400
Role ?
%h5.mb-3.text-3xl.font-extrabold.leading-none.sm:text-4xl
= @member.name
.mb-8.text-gray-800
.prose= markdown(@member.bio)
.flex.items-center
%a.inline-flex.items-center.font-semibold.transition-colors.duration-200.text-deep-purple-accent-400.hover:text-deep-purple-800{"aria-label" => "", :href => "/"}
Learn More
%svg.inline-block.w-3.ml-2{:fill => "currentColor", :viewbox => "0 0 12 12"}
%path{:d => "M9.707,5.293l-5-5A1,1,0,0,0,3.293,1.707L7.586,6,3.293,10.293a1,1,0,1,0,1.414,1.414l5-5A1,1,0,0,0,9.707,5.293Z"}
%section.mx-20
.flex.justify-center
.px-4.py-4.md:py-10.lg:py-16.mx-5.md:mx-12.lg:mx-20.text-center
%h1.text-2xl.font-bold.tracking-tight.sm:text-4xl
Settings and profiles
%h4.text-xl.mt-4.md:text-2xl
Allowing you to create and edit various profiles
.mt-4.text-lg.pt-4
You can have seperate profiles as teacher, artist, or coop member.
If you choose to create them they will be publicly listed.
Techers and Artists may then create events.
-if @member == current_member or current_member.admin?
.grid.grid-cols-2.mx-20
.first
- Profile.types.each do |kind|
.grid.grid-cols-2
- if profile = @member.profile(kind)
%div
=profile.Kind
exists with name
=link_to profile.name , profile_path(profile) , class: "underline"
= link_to edit_profile_path(profile) do
%button.bg-cyan-200.mr-3.inline-block.rounded-lg.px-4.py-3.text-md.font-medium.border.border-gray-400
Edit
=profile.Kind
-else
%div Create new #{kind.capitalize} profile as
= link_to new_profile_path(kind: kind) do
%button.bg-cyan-200.mr-3.inline-block.rounded-lg.px-4.py-3.text-md.font-medium.border.border-gray-400
New
= kind.capitalize
.flex.justify-around
= link_to edit_member_path(@member) do
%button.bg-cyan-200.mr-3.inline-block.rounded-lg.px-4.py-3.text-md.font-medium.border.border-gray-400
Edit
- if @member.profile
= link_to edit_profile_path(@member.profile) do
%button.bg-cyan-200.mr-3.inline-block.rounded-lg.px-4.py-3.text-md.font-medium.border.border-gray-400
Edit profile profile
-else
= link_to new_profile_path do
%button.bg-cyan-200.mr-3.inline-block.rounded-lg.px-4.py-3.text-md.font-medium.border.border-gray-400
Create profile profile
.grid.grid-cols-3.gap-4
-@member.entities.each do |entity|
%div= entity.type
%div= entity.name
%div= entity.value
= form_tag( destroy_member_session_path , {method: :delete } ) do
%button.bg-cyan-200.mr-3.inline-block.rounded-lg.px-4.py-3.text-md.font-medium.border.border-gray-400{type: :submit}
Sign out
.grid.grid-cols-6.gap-4.mt-10.mx-10
-@member.entities.each do |entity|
%div= entity.type
%div= entity.name
%div= entity.value
= form_tag( destroy_member_session_path , {method: :delete } ) do
%button.mt-10.ml-10.bg-cyan-200.mr-3.inline-block.rounded-lg.px-4.py-3.text-md.font-medium.border.border-gray-400{type: :submit}
Sign out

View File

@ -3,6 +3,7 @@
= f.input :name
= f.input :bio
= f.input :kind, :as => :hidden
= f.input :picture , as: :file , label: (@profile.picture.blank? ? "Add picture" : "Change picture (optional)")
.flex.justify-between.mt-4
@ -10,4 +11,4 @@
= f.submit 'Save'
%button.bg-cyan-200{class: button_classes}
= link_to 'Cancel', profiles_path
= link_to 'Cancel', member_path(current_member)

View File

@ -1,4 +1,7 @@
.flex.justify-center
.column
.text-xl.m-4 Edit your profile profile
.text-xl.m-4
Edit your
=@profile.Kind
profile
= render 'form'

View File

@ -1,4 +1,7 @@
.flex.justify-center
.column
.text-xl.m-4 Create your profile profile
.text-xl.m-4
Create your
=@profile.kind.capitalize
profile
= render 'form'

View File

@ -1,5 +1,10 @@
.px-4.py-16.mx-auto.sm:max-w-xl.md:max-w-full.lg:max-w-screen-xl.md:px-24.lg:px-8.lg:py-20
.flex.flex-col.max-w-screen-lg.overflow-hidden.bg-white.border.rounded.shadow-sm.lg:flex-row.sm:mx-auto
.flex.justify-center
.px-4.py-4.text-center
%h1text-2xl.font-bold.tracking-tight.sm:text-4xl
= @profile.Kind
profile
.flex.py-4.flex-col.max-w-screen-lg.overflow-hidden.bg-white.border.rounded.shadow-sm.lg:flex-row.sm:mx-auto
.relative{:class => "lg:w-1/2"}
-if @profile.picture_url
= image_tag @profile.picture_url, class: "object-cover w-full lg:absolute h-80 lg:h-full"

View File

@ -0,0 +1,18 @@
require 'test_helper'
class MemberPolicyTest < ActiveSupport::TestCase
def test_scope
end
def test_show
end
def test_create
end
def test_update
end
def test_destroy
end
end