From 915b5cbb2199f35274c212cf69b2c2fd5a07ca61 Mon Sep 17 00:00:00 2001 From: BranHill21 Date: Fri, 18 Oct 2024 22:54:24 -0500 Subject: [PATCH 1/8] Fix for edit gallery project existance step --- features/edit_gallery.feature | 2 +- .../step_definitions/edit_gallery_steps.rb | 37 ++++++++++++++++--- 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/features/edit_gallery.feature b/features/edit_gallery.feature index 6b059769..ef1a36aa 100644 --- a/features/edit_gallery.feature +++ b/features/edit_gallery.feature @@ -8,7 +8,7 @@ Background: project in database Given the following project exist: | gallery_title | gallery_description | gallery_picture | - | BigProject | Here is a project | "http://example.com/img1.png" | + | BigProject | Here is a project | "test_pic.jpg" | Scenario: Enter the page to edit a project Given I am on the details page for "BigProject" diff --git a/features/step_definitions/edit_gallery_steps.rb b/features/step_definitions/edit_gallery_steps.rb index 4c2b3353..675a0070 100644 --- a/features/step_definitions/edit_gallery_steps.rb +++ b/features/step_definitions/edit_gallery_steps.rb @@ -1,10 +1,37 @@ Given(/^the following project exist:$/) do |table| table.hashes.each do |gallery| - gallery['gallery_picture'] = gallery['gallery_picture'].gsub('"', '') if gallery['gallery_picture'] - - Gallery.create!(gallery_title: gallery['gallery_title'], - gallery_description: gallery['gallery_description'], - gallery_picture: gallery['gallery_picture']) + # Remove " and set the path to the file + gallery['gallery_picture'] = gallery['gallery_picture'].gsub('"', '') if gallery['gallery_picture'] + file_path = Rails.root.join("db", "seed_files", gallery['gallery_picture']) + + # Create a GeneralInfo record with values and a fake profile picture + general_info = GeneralInfo.new + general_info.first_name = "John" + general_info.last_name = "Doe" + general_info.userKey = "user123" + general_info.company = "TestInc" + general_info.industry = "Fashion" + general_info.job_name = "Designer" + general_info.highlights = "Just a test User" + general_info.country = "United States" + general_info.state = "Texas" + general_info.city = "College Station" + general_info.emailaddr = "john.doe@example.com" + general_info.profile_picture = Rack::Test::UploadedFile.new(file_path, 'image/jpeg') # Update to 'image/jpeg' for test_pic.jpg + general_info.save! + + # Simulate file uploads using Rack::Test::UploadedFile for the Gallery + gallery_pictures = [Rack::Test::UploadedFile.new(file_path, 'image/jpeg')] # Update to 'image/jpeg' + test_pictures = [Rack::Test::UploadedFile.new(file_path, 'image/jpeg')] # Update to 'image/jpeg' + + # Create the Gallery record with the necessary attributes + Gallery.create!( + gallery_title: gallery['gallery_title'], + gallery_description: gallery['gallery_description'], + GeneralInfo_id: general_info.id, + gallery_picture: gallery_pictures, + test_picture: test_pictures + ) end end \ No newline at end of file From 70984317be9669415b898742e54c5a183a1c8570 Mon Sep 17 00:00:00 2001 From: BranHill21 Date: Fri, 18 Oct 2024 23:01:54 -0500 Subject: [PATCH 2/8] Merge branch 'master' of https://github.com/omarkhater-school/NXTFolio --- app/assets/stylesheets/application.css | 14 +-- app/controllers/galleries_controller.rb | 112 +++++++++++++------ app/views/galleries/edit.html.erb | 24 ++-- app/views/galleries/show.html.erb | 34 +++--- app/views/show_profile/show_profile.html.erb | 1 + install/setup.sh | 2 +- 6 files changed, 113 insertions(+), 74 deletions(-) diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 7edd2301..04f46405 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -55,16 +55,4 @@ margin-bottom: 10px; background-color: #555555; padding: 10px; -} - -.flash { - padding: 10px; - margin: 10px 0; - border-radius: 5px; -} - -.flash-notice { -background-color: #d4edda; -color: #155724; -border: 1px solid #c3e6cb; -}*/ +} */ \ No newline at end of file diff --git a/app/controllers/galleries_controller.rb b/app/controllers/galleries_controller.rb index b903efc1..45fe3e64 100644 --- a/app/controllers/galleries_controller.rb +++ b/app/controllers/galleries_controller.rb @@ -8,47 +8,81 @@ def create @general_info = GeneralInfo.find_by(userKey: session[:current_user_key]) params[:gallery][:GeneralInfo_id] = @general_info.id @gallery = Gallery.new(gallery_params) - if @gallery.gallery_picture.empty? - flash.now[:error] = "Please add at least one image." + if @gallery.gallery_picture.length == 0 + flash.now[:error] = "You should add at least 1 image!" render 'new' + elsif @gallery.gallery_picture.length > 5 - flash.now[:error] = "You cannot add more than five images." + flash.now[:error] = "You can't add more than 5 images!" render 'new' + + elsif @gallery.save - flash[:notice] = "#{@gallery.gallery_title} has been successfully created." + flash[:notice] = "Project Created" + redirect_to '/show_profile' else render 'new' end end - def edit - @gallery = Gallery.find(params[:id]) - end + # def edit + # @gallery = Gallery.find(params[:id]) + # if @gallery.update(gallery_params) + # redirect_to @gallery + # else + # render 'edit' + # end + # end + # def edit + # @gallery = Gallery.find(params[:id]) + # end + + # def update + # #@gallery = Gallery.find(params[:id]) + # @gallery = Gallery.find(35) + # if @gallery.update(gallery_params) + # redirect_to @gallery + # else + # render 'edit' + # end + # end + + + # def update + # @gallery = Gallery.find(params[:id]) + # if @gallery.update(gallery_params) + # redirect_to @gallery + # else + # render 'edit' + # end + # end - #2024fall: combine transfer and update function def update @gallery = Gallery.find(params[:id]) + # for item in @gallery.test_picture do + # @gallery.gallery_picture.push(item) + # end + #@gallery.save! + #puts(@gallery.test_picture.length) + #puts("!!!!!!!") if @gallery.update(gallery_params) - current_picture = @gallery.gallery_picture + @gallery.test_picture - if @gallery.gallery_picture.empty? - flash.now[:error] = "Please add at least one image." - render 'edit' - elsif current_picture.length > 5 - flash.now[:error] = "The gallery cannot contain more than five images." - @gallery.test_picture.clear - @gallery.save + @gallery.save + if @gallery.test_picture.length == 0 + flash.now[:error] = "Add at least 1 image!" render 'edit' else - @gallery.gallery_picture += @gallery.test_picture - @gallery.test_picture.clear - @gallery.save - flash[:notice] = "#{@gallery.gallery_title} has been successfully updated." - redirect_to @gallery + flash[:notice] = "Images uploaded!" + redirect_to edit_gallery_path(params[:id]) end + else + render 'edit' end end + + + def destroy #logger.debug(@gallery_picture.inspect) #remove_image_at_index(params[ :gallery_picture].to_i) @@ -57,33 +91,43 @@ def destroy @gallery.destroy redirect_to galleries_path end - # spring2023 delete single image in the gallery -def delete - @gallery = Gallery.find(params[:id]) - index = params[:idx].to_i - deleted_image = @gallery.gallery_picture.delete_at(index) - @gallery.save - flash.now[:notice] = "Image deleted successfully." - render 'edit' -end + def delete + @gallery = Gallery.find(params[:id]) + index_str = params[:idx] + index = (index_str).to_i + #puts(index.to_s + "!!!!!!!!!!") + img = @gallery.gallery_picture[index] + @gallery.gallery_picture.delete_at(index) + if img.in?(@gallery.test_picture) + @gallery.test_picture.delete(img) + end + @gallery.save + end + # spring2023 add images to gallery def transfer @gallery = Gallery.find(params[:id]) limit = 5 - @gallery.gallery_picture.length - if @gallery.test_picture.length > limit + #puts(limit) + if @gallery.test_picture.length == 0 + render 'edit' + elsif @gallery.test_picture.length > limit + puts("wrong!!!!!!!!!!!!") flash.now[:error] = "You can not have more than 5 images in a gallery!" @gallery.test_picture.clear @gallery.save render 'edit' else - @gallery.gallery_picture += @gallery.test_picture - flash[:success] = "successfully upload picture" + #puts("transfer running!!!!!!!!!!!") + puts("success!!!!!!!!!!!!") + added = @gallery.test_picture + @gallery.gallery_picture += added + @gallery.test_picture.clear @gallery.save end - redirect_to @gallery end diff --git a/app/views/galleries/edit.html.erb b/app/views/galleries/edit.html.erb index 45c69636..b01aaa2c 100644 --- a/app/views/galleries/edit.html.erb +++ b/app/views/galleries/edit.html.erb @@ -28,8 +28,7 @@ -

Edit Gallery Details

- +

Add images (No more than 5 images pre gallery!)

<% if flash[:notice] %>
<%= flash[:notice] %> @@ -49,6 +48,7 @@ <% if @gallery.errors.any? %>

<%= pluralize(@gallery.errors.count, "error") %> prohibited this gallery from being saved:

+
    <% @gallery.errors.full_messages.each do |msg| %>
  • <%= msg %>
  • @@ -77,12 +77,6 @@
    -
    - <% idx = @gallery.gallery_picture.index(picture)%> - <% if @gallery.gallery_picture.length > 1 %> - <%= link_to 'Delete', gallery_delete_path(@gallery, idx), method: :get%> - <% end %> -
    <% end %> @@ -91,20 +85,24 @@
    - <%= f.label :upload_images, 'Choose Files', class: 'custom-file-label' %> - <%= f.file_field :test_picture, multiple: true, class: 'custom-file-input', id: 'test_picture' %> -
    - <%= submit_tag 'Update Project', class: 'btn btn-primary' %> + <%= f.label :upload_images , multipart: true %> + <%= f.file_field :test_picture, multiple: true, class: 'custom-file-input', id: 'test_picture' , style: "margin-bottom: 10px;"%> + +
    + <%= button_tag "Add images", type: "submit" %>
    + + Update gallery
    - <% end %> Back + + <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %> diff --git a/app/views/galleries/show.html.erb b/app/views/galleries/show.html.erb index a40efae8..bf9a2c39 100644 --- a/app/views/galleries/show.html.erb +++ b/app/views/galleries/show.html.erb @@ -34,22 +34,12 @@
- <% if flash[:notice] %> -
- <%= flash[:notice] %> -
- <% end %>

<%= @gallery.gallery_title %>

- <%if GeneralInfo.find(@gallery.GeneralInfo_id).userKey == session[:current_user_key]%> - <%= link_to 'Edit This Project', edit_gallery_path(@gallery.id)%> -
- <%= link_to 'Delete This Project', show_profile_destroy_path(@gallery.id), :method => :delete, data: { confirm: "Are you sure to delete?" } %> - <%end%> -
+
+
+ + <% end %> + <%#
-
%> + %> + + <%if @gallery.gallery_picture.length() == 1 && owner.userKey == session[:current_user_key]%> + <%= link_to 'Delete This Project', show_profile_destroy_path(@gallery.id), :method => :delete, data: { confirm: "Are you sure to delete?" } %> + <%end%> @@ -123,6 +127,10 @@
+ <% if owner && owner.userKey == session[:current_user_key] %> + <%= link_to 'Add pictures', edit_gallery_path(@gallery), class: 'btn btn-success' %> + <%end %> + <%# Fall 2023: Piyush Sharan, adding comments to Gallery %> <% if ((owner && owner.userKey == session[:current_user_key]) || (@collab_count && @collab_count >= 3)) %> <%= link_to 'Enter a comment', gallery_add_comment_path(@gallery), class: 'btn btn-success' %> diff --git a/app/views/show_profile/show_profile.html.erb b/app/views/show_profile/show_profile.html.erb index 8a4bb750..84d294c6 100644 --- a/app/views/show_profile/show_profile.html.erb +++ b/app/views/show_profile/show_profile.html.erb @@ -120,6 +120,7 @@ +
diff --git a/install/setup.sh b/install/setup.sh index b559b45a..83a23789 100644 --- a/install/setup.sh +++ b/install/setup.sh @@ -150,4 +150,4 @@ rails server -b 0.0.0.0 -p 3000 # if every works, that's great! # if not, try using docker-compose -# GOOD LUCK! \ No newline at end of file +# GOOD LUCK! From 2430994039b85f5e3754c43c30e4c500733e9bd4 Mon Sep 17 00:00:00 2001 From: Likhith_Reddy <112001021@smail.iitpkd.ac.in> Date: Fri, 8 Nov 2024 22:57:29 -0600 Subject: [PATCH 3/8] made UI changes to edit gellery --- app/views/galleries/edit.html.erb | 24 ++++++++++++---------- app/views/galleries/show.html.erb | 34 ++++++++++++------------------- 2 files changed, 26 insertions(+), 32 deletions(-) diff --git a/app/views/galleries/edit.html.erb b/app/views/galleries/edit.html.erb index b01aaa2c..45c69636 100644 --- a/app/views/galleries/edit.html.erb +++ b/app/views/galleries/edit.html.erb @@ -28,7 +28,8 @@
-

Add images (No more than 5 images pre gallery!)

+

Edit Gallery Details

+ <% if flash[:notice] %>
<%= flash[:notice] %> @@ -48,7 +49,6 @@ <% if @gallery.errors.any? %>

<%= pluralize(@gallery.errors.count, "error") %> prohibited this gallery from being saved:

-
    <% @gallery.errors.full_messages.each do |msg| %>
  • <%= msg %>
  • @@ -77,6 +77,12 @@
    +
    + <% idx = @gallery.gallery_picture.index(picture)%> + <% if @gallery.gallery_picture.length > 1 %> + <%= link_to 'Delete', gallery_delete_path(@gallery, idx), method: :get%> + <% end %> +
    <% end %> @@ -85,24 +91,20 @@
    - <%= f.label :upload_images , multipart: true %> - <%= f.file_field :test_picture, multiple: true, class: 'custom-file-input', id: 'test_picture' , style: "margin-bottom: 10px;"%> - -
    - <%= button_tag "Add images", type: "submit" %> + <%= f.label :upload_images, 'Choose Files', class: 'custom-file-label' %> + <%= f.file_field :test_picture, multiple: true, class: 'custom-file-input', id: 'test_picture' %> +
    + <%= submit_tag 'Update Project', class: 'btn btn-primary' %>
    - - Update gallery
    + <% end %> Back - - <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %> diff --git a/app/views/galleries/show.html.erb b/app/views/galleries/show.html.erb index bf9a2c39..a40efae8 100644 --- a/app/views/galleries/show.html.erb +++ b/app/views/galleries/show.html.erb @@ -34,12 +34,22 @@
+ <% if flash[:notice] %> +
+ <%= flash[:notice] %> +
+ <% end %>

<%= @gallery.gallery_title %>

-
+ <%if GeneralInfo.find(@gallery.GeneralInfo_id).userKey == session[:current_user_key]%> + <%= link_to 'Edit This Project', edit_gallery_path(@gallery.id)%> +
+ <%= link_to 'Delete This Project', show_profile_destroy_path(@gallery.id), :method => :delete, data: { confirm: "Are you sure to delete?" } %> + <%end%> +
- - +
<% end %> - <%#
-
%> - + %> - <%if @gallery.gallery_picture.length() == 1 && owner.userKey == session[:current_user_key]%> - <%= link_to 'Delete This Project', show_profile_destroy_path(@gallery.id), :method => :delete, data: { confirm: "Are you sure to delete?" } %> - <%end%> @@ -127,10 +123,6 @@
- <% if owner && owner.userKey == session[:current_user_key] %> - <%= link_to 'Add pictures', edit_gallery_path(@gallery), class: 'btn btn-success' %> - <%end %> - <%# Fall 2023: Piyush Sharan, adding comments to Gallery %> <% if ((owner && owner.userKey == session[:current_user_key]) || (@collab_count && @collab_count >= 3)) %> <%= link_to 'Enter a comment', gallery_add_comment_path(@gallery), class: 'btn btn-success' %> From 2dbcb96fe9e8cf87b0136bce18cf3de0ffcf7b5e Mon Sep 17 00:00:00 2001 From: Likhith_Reddy <112001021@smail.iitpkd.ac.in> Date: Fri, 8 Nov 2024 22:58:50 -0600 Subject: [PATCH 4/8] Sprint 4 Plan added --- app/controllers/galleries_controller.rb | 236 ++++++++++-------------- documentation/Fall2024/Sprint4Plan.pdf | Bin 0 -> 55498 bytes 2 files changed, 94 insertions(+), 142 deletions(-) create mode 100644 documentation/Fall2024/Sprint4Plan.pdf diff --git a/app/controllers/galleries_controller.rb b/app/controllers/galleries_controller.rb index 45fe3e64..bd62502c 100644 --- a/app/controllers/galleries_controller.rb +++ b/app/controllers/galleries_controller.rb @@ -1,133 +1,91 @@ +# frozen_string_literal: true + class GalleriesController < ApplicationController def new @gallery = Gallery.new end - #create the project, use params to sent the foreign key to gallery database + # create the project, use params to sent the foreign key to gallery database def create @general_info = GeneralInfo.find_by(userKey: session[:current_user_key]) params[:gallery][:GeneralInfo_id] = @general_info.id @gallery = Gallery.new(gallery_params) - if @gallery.gallery_picture.length == 0 - flash.now[:error] = "You should add at least 1 image!" + if @gallery.gallery_picture.empty? + flash.now[:error] = "Please add at least one image." render 'new' - elsif @gallery.gallery_picture.length > 5 - flash.now[:error] = "You can't add more than 5 images!" + flash.now[:error] = "You cannot add more than five images." render 'new' - - elsif @gallery.save - flash[:notice] = "Project Created" - + flash[:notice] = "#{@gallery.gallery_title} has been successfully created." redirect_to '/show_profile' else render 'new' end end - # def edit - # @gallery = Gallery.find(params[:id]) - # if @gallery.update(gallery_params) - # redirect_to @gallery - # else - # render 'edit' - # end - # end - # def edit - # @gallery = Gallery.find(params[:id]) - # end - - # def update - # #@gallery = Gallery.find(params[:id]) - # @gallery = Gallery.find(35) - # if @gallery.update(gallery_params) - # redirect_to @gallery - # else - # render 'edit' - # end - # end - - - # def update - # @gallery = Gallery.find(params[:id]) - # if @gallery.update(gallery_params) - # redirect_to @gallery - # else - # render 'edit' - # end - # end + def edit + @gallery = Gallery.find(params[:id]) + end + #2024fall: combine transfer and update function def update @gallery = Gallery.find(params[:id]) - # for item in @gallery.test_picture do - # @gallery.gallery_picture.push(item) - # end - #@gallery.save! - #puts(@gallery.test_picture.length) - #puts("!!!!!!!") if @gallery.update(gallery_params) - @gallery.save - if @gallery.test_picture.length == 0 - flash.now[:error] = "Add at least 1 image!" + current_picture = @gallery.gallery_picture + @gallery.test_picture + if @gallery.gallery_picture.empty? + flash.now[:error] = "Please add at least one image." + render 'edit' + elsif current_picture.length > 5 + flash.now[:error] = "The gallery cannot contain more than five images." + @gallery.test_picture.clear + @gallery.save render 'edit' else - flash[:notice] = "Images uploaded!" - redirect_to edit_gallery_path(params[:id]) + @gallery.gallery_picture += @gallery.test_picture + @gallery.test_picture.clear + @gallery.save + flash[:notice] = "#{@gallery.gallery_title} has been successfully updated." + redirect_to @gallery end - else - render 'edit' end end - - - def destroy - #logger.debug(@gallery_picture.inspect) - #remove_image_at_index(params[ :gallery_picture].to_i) - #remove_file(params[ :gallery_picture]) + # logger.debug(@gallery_picture.inspect) + # remove_image_at_index(params[ :gallery_picture].to_i) + # remove_file(params[ :gallery_picture]) @gallery = Gallery.find(params[:id]) @gallery.destroy redirect_to galleries_path end + # spring2023 delete single image in the gallery - def delete - @gallery = Gallery.find(params[:id]) - index_str = params[:idx] - index = (index_str).to_i - #puts(index.to_s + "!!!!!!!!!!") - img = @gallery.gallery_picture[index] - @gallery.gallery_picture.delete_at(index) - if img.in?(@gallery.test_picture) - @gallery.test_picture.delete(img) - end - @gallery.save - end - +def delete + @gallery = Gallery.find(params[:id]) + index = params[:idx].to_i + deleted_image = @gallery.gallery_picture.delete_at(index) + @gallery.save + flash.now[:notice] = "Image deleted successfully." + render 'edit' +end # spring2023 add images to gallery def transfer @gallery = Gallery.find(params[:id]) limit = 5 - @gallery.gallery_picture.length - #puts(limit) - if @gallery.test_picture.length == 0 - render 'edit' - elsif @gallery.test_picture.length > limit - puts("wrong!!!!!!!!!!!!") + if @gallery.test_picture.length > limit flash.now[:error] = "You can not have more than 5 images in a gallery!" @gallery.test_picture.clear @gallery.save render 'edit' else - #puts("transfer running!!!!!!!!!!!") - puts("success!!!!!!!!!!!!") - added = @gallery.test_picture - @gallery.gallery_picture += added - + @gallery.gallery_picture += @gallery.test_picture + flash[:success] = "successfully upload picture" @gallery.test_picture.clear @gallery.save end + redirect_to @gallery end @@ -135,16 +93,16 @@ def transfer #File.delete(gallery_picture) #end - #def set_gallery - #@gallery = Gallery.find(params[:gallery_id]) - #end + # def set_gallery + # @gallery = Gallery.find(params[:gallery_id]) + # end - #def remove_image_at_index(index) - #remain_images = gallery_params # copy the array - #deleted_image = remain_gallery_picture.delete_at(index) # delete the target image - #deleted_image.try(:remove!) # delete image from S3 - #@gallery.gallery_pictures = remain_images # re-assign back - #end + # def remove_image_at_index(index) + # remain_images = gallery_params # copy the array + # deleted_image = remain_gallery_picture.delete_at(index) # delete the target image + # deleted_image.try(:remove!) # delete image from S3 + # @gallery.gallery_pictures = remain_images # re-assign back + # end # def remove_image(image) # @gallery.gallery_picture.delete(image) @@ -158,86 +116,81 @@ def transfer # redirect_to gallery, notice: 'Image was successfully removed.' # end - - - - - #def index - #end + # def index + # end def show - - puts (params.inspect) - #@gallery = Gallery.find(params[:project_key]) + puts(params.inspect) + # @gallery = Gallery.find(params[:project_key]) @gallery = Gallery.find(params[:id]) - # NXTFolio : Added in Spring 2023 for tagging feature @gallery_tagging = @gallery.gallery_taggings - - logger.info("Debugging Average ") - current_user = GeneralInfo.find_by(userKey: session[:current_user_key]) + + logger.info('Debugging Average ') + current_user = GeneralInfo.find_by(userKey: session[:current_user_key]) if current_user current_user_id = current_user.id @collab_count = Collaboration.where(general_info_id: current_user_id).count - print("Users " + current_user_id.to_s + " collaborated with: ") + print("Users #{current_user_id} collaborated with: ") print(@collab_count) end - if @gallery.reviews.blank? - @average_review=0 - else - @average_review=@gallery.reviews.average(:rating).round(2) - end + @average_review = if @gallery.reviews.blank? + 0 + else + @gallery.reviews.average(:rating).round(2) + end end # NXTFolio : Added function in Spring 2023 for tagging feature def create_tagging @gallery = Gallery.find_by(id: params[:id]) - tagged_ids = params[:gallery_tagging][:tagged_user_id].split(",").reject(&:blank?) + tagged_ids = params[:gallery_tagging][:tagged_user_id].split(',').reject(&:blank?) puts tagged_ids tagged_ids.each do |tagged_id| if GalleryTagging.where(gallery_id: params[:id], general_info_id: tagged_id).empty? @gallery_tagging = GalleryTagging.new(gallery_id: params[:id], general_info_id: tagged_id) if @gallery_tagging.save - flash[:notice] = "Tagged User(s) Successfully" + flash[:notice] = 'Tagged User(s) Successfully' else - flash[:alert] = "Failed to Tag User(s)" + flash[:alert] = 'Failed to Tag User(s)' end end - + current_user_id = GeneralInfo.find_by(userKey: session[:current_user_key]).id - print("Making collaboration between: " + current_user_id.to_s + " and " + tagged_id.to_s) + print("Making collaboration between: #{current_user_id} and #{tagged_id}") if Collaboration.where(general_info_id: current_user_id, collaborator_id: tagged_id).empty? @collab = Collaboration.new(general_info_id: current_user_id, collaborator_id: tagged_id) if @collab.save - flash[:notice] = "Collaborations saved Successfully" + flash[:notice] = 'Collaborations saved Successfully' else - flash[:alert] = "Failed to save Collaboration" + flash[:alert] = 'Failed to save Collaboration' end end - if Collaboration.where(general_info_id: tagged_id, collaborator_id: current_user_id).empty? - @collab = Collaboration.new(general_info_id: tagged_id, collaborator_id: current_user_id) - if @collab.save - flash[:notice] = "Collaborations saved Successfully" - else - flash[:alert] = "Failed to save Collaboration" - end + next unless Collaboration.where(general_info_id: tagged_id, collaborator_id: current_user_id).empty? + + @collab = Collaboration.new(general_info_id: tagged_id, collaborator_id: current_user_id) + if @collab.save + flash[:notice] = 'Collaborations saved Successfully' + else + flash[:alert] = 'Failed to save Collaboration' end end invited_email = params[:gallery_tagging][:invited_email] if invited_email.present? - inviter_name = GeneralInfo.find_by(id:@gallery.GeneralInfo_id).first_name + " " + GeneralInfo.find_by(id:@gallery.GeneralInfo_id).last_name - invited_name = GeneralInfo.find_by(emailaddr: invited_email).first_name + " " + GeneralInfo.find_by(emailaddr: invited_email).last_name + inviter_name = "#{GeneralInfo.find_by(id: @gallery.GeneralInfo_id).first_name} #{GeneralInfo.find_by(id: @gallery.GeneralInfo_id).last_name}" + invited_name = "#{GeneralInfo.find_by(emailaddr: invited_email).first_name} #{GeneralInfo.find_by(emailaddr: invited_email).last_name}" project_name = @gallery.gallery_title project_key = params[:id] - InvitationMailer.invitation_email(invited_email,invited_name,inviter_name,project_name,project_key).deliver_now + InvitationMailer.invitation_email(invited_email, invited_name, inviter_name, project_name, + project_key).deliver_now end redirect_to '/show_profile' - end + def destroy_tagging @gallery = Gallery.find(params[:gallery_id]) @tagging = @gallery.gallery_taggings.find(params[:id]) @@ -250,25 +203,23 @@ def destroy_tagging def add_comment @gallery = Gallery.find(params[:id]) end - + # Fall 2023: Piyush Sharan: Post Comments def post_comment @gallery = Gallery.find(params[:id]) @comment = @gallery.comments.build(comment_params) @user = GeneralInfo.find_by(userKey: session[:current_user_key]) - @comment.comment_by = @user.first_name + " " + @user.last_name + @comment.comment_by = "#{@user.first_name} #{@user.last_name}" # Fall 2023: Vishnuvasan: Added check for empty comment if @comment.body.blank? - flash[:error] = "Comment cannot be empty." + flash[:error] = 'Comment cannot be empty.' + redirect_to gallery_path(@gallery) + elsif @comment.save + flash[:notice] = 'Comment added successfully.' redirect_to gallery_path(@gallery) else - if @comment.save - flash[:notice] = "Comment added successfully." - redirect_to gallery_path(@gallery) - else - flash.now[:alert] = "Failed to add comment." - render 'add_comment' - end + flash.now[:alert] = 'Failed to add comment.' + render 'add_comment' end end @@ -290,16 +241,17 @@ def create_tag def gallery_params # NXTFolio : Added gallery_tagging in Spring 2023 for tagging feature - params.require(:gallery).permit(:id,:gallery, :gallery_title, :gallery_description, :ratings, :gallery_totalRate, :gallery_totalRator, :GeneralInfo_id, :gallery_tagging, :gallery_picture => [], :remove_image_ids => [], :test_picture => []) + params.require(:gallery).permit(:id, :gallery, :gallery_title, :gallery_description, :ratings, :gallery_totalRate, + :gallery_totalRator, :GeneralInfo_id, :gallery_tagging, gallery_picture: [], remove_image_ids: [], test_picture: []) end # NXTFolio : Added in Spring 2023 for tagging feature def gallery_tagging_params - params.require(:gallery_tagging).permit(tagged_user_id: [] ) + params.require(:gallery_tagging).permit(tagged_user_id: []) end - + # Fall 2023: To add Comments def comment_params params.require(:comment).permit(:body) end -end \ No newline at end of file +end diff --git a/documentation/Fall2024/Sprint4Plan.pdf b/documentation/Fall2024/Sprint4Plan.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3227fd6f7a50a425a237f5fba7d733c6919d2644 GIT binary patch literal 55498 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 RBG55F3XyYj%c#hb{|`{!?708{ literal 0 HcmV?d00001 From bba5701ad2f9f23f421a919568f3d2cd37066ad6 Mon Sep 17 00:00:00 2001 From: Likhith_Reddy <112001021@smail.iitpkd.ac.in> Date: Fri, 8 Nov 2024 23:37:27 -0600 Subject: [PATCH 5/8] Revert "made UI changes to edit gellery" This reverts commit 2430994039b85f5e3754c43c30e4c500733e9bd4. --- app/views/galleries/edit.html.erb | 24 ++++++++++------------ app/views/galleries/show.html.erb | 34 +++++++++++++++++++------------ 2 files changed, 32 insertions(+), 26 deletions(-) diff --git a/app/views/galleries/edit.html.erb b/app/views/galleries/edit.html.erb index 45c69636..b01aaa2c 100644 --- a/app/views/galleries/edit.html.erb +++ b/app/views/galleries/edit.html.erb @@ -28,8 +28,7 @@ -

Edit Gallery Details

- +

Add images (No more than 5 images pre gallery!)

<% if flash[:notice] %>
<%= flash[:notice] %> @@ -49,6 +48,7 @@ <% if @gallery.errors.any? %>

<%= pluralize(@gallery.errors.count, "error") %> prohibited this gallery from being saved:

+
    <% @gallery.errors.full_messages.each do |msg| %>
  • <%= msg %>
  • @@ -77,12 +77,6 @@
    -
    - <% idx = @gallery.gallery_picture.index(picture)%> - <% if @gallery.gallery_picture.length > 1 %> - <%= link_to 'Delete', gallery_delete_path(@gallery, idx), method: :get%> - <% end %> -
    <% end %> @@ -91,20 +85,24 @@
    - <%= f.label :upload_images, 'Choose Files', class: 'custom-file-label' %> - <%= f.file_field :test_picture, multiple: true, class: 'custom-file-input', id: 'test_picture' %> -
    - <%= submit_tag 'Update Project', class: 'btn btn-primary' %> + <%= f.label :upload_images , multipart: true %> + <%= f.file_field :test_picture, multiple: true, class: 'custom-file-input', id: 'test_picture' , style: "margin-bottom: 10px;"%> + +
    + <%= button_tag "Add images", type: "submit" %>
    + + Update gallery
    - <% end %> Back + + <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %> diff --git a/app/views/galleries/show.html.erb b/app/views/galleries/show.html.erb index a40efae8..bf9a2c39 100644 --- a/app/views/galleries/show.html.erb +++ b/app/views/galleries/show.html.erb @@ -34,22 +34,12 @@
- <% if flash[:notice] %> -
- <%= flash[:notice] %> -
- <% end %>

<%= @gallery.gallery_title %>

- <%if GeneralInfo.find(@gallery.GeneralInfo_id).userKey == session[:current_user_key]%> - <%= link_to 'Edit This Project', edit_gallery_path(@gallery.id)%> -
- <%= link_to 'Delete This Project', show_profile_destroy_path(@gallery.id), :method => :delete, data: { confirm: "Are you sure to delete?" } %> - <%end%> -
+
+
+ + <% end %> + <%#
-
%> + %> + + <%if @gallery.gallery_picture.length() == 1 && owner.userKey == session[:current_user_key]%> + <%= link_to 'Delete This Project', show_profile_destroy_path(@gallery.id), :method => :delete, data: { confirm: "Are you sure to delete?" } %> + <%end%> @@ -123,6 +127,10 @@
+ <% if owner && owner.userKey == session[:current_user_key] %> + <%= link_to 'Add pictures', edit_gallery_path(@gallery), class: 'btn btn-success' %> + <%end %> + <%# Fall 2023: Piyush Sharan, adding comments to Gallery %> <% if ((owner && owner.userKey == session[:current_user_key]) || (@collab_count && @collab_count >= 3)) %> <%= link_to 'Enter a comment', gallery_add_comment_path(@gallery), class: 'btn btn-success' %> From 631decbb7a1b132a5b0bdeffc1d7c1371983cb78 Mon Sep 17 00:00:00 2001 From: Likhith_Reddy <112001021@smail.iitpkd.ac.in> Date: Fri, 8 Nov 2024 23:47:44 -0600 Subject: [PATCH 6/8] revert to previous commit and added only Sprint 4 Plan document --- app/controllers/galleries_controller.rb | 236 +++++++++++------- features/edit_gallery.feature | 83 +++--- .../step_definitions/edit_gallery_steps.rb | 66 ++--- 3 files changed, 217 insertions(+), 168 deletions(-) diff --git a/app/controllers/galleries_controller.rb b/app/controllers/galleries_controller.rb index bd62502c..45fe3e64 100644 --- a/app/controllers/galleries_controller.rb +++ b/app/controllers/galleries_controller.rb @@ -1,91 +1,133 @@ -# frozen_string_literal: true - class GalleriesController < ApplicationController def new @gallery = Gallery.new end - # create the project, use params to sent the foreign key to gallery database + #create the project, use params to sent the foreign key to gallery database def create @general_info = GeneralInfo.find_by(userKey: session[:current_user_key]) params[:gallery][:GeneralInfo_id] = @general_info.id @gallery = Gallery.new(gallery_params) - if @gallery.gallery_picture.empty? - flash.now[:error] = "Please add at least one image." + if @gallery.gallery_picture.length == 0 + flash.now[:error] = "You should add at least 1 image!" render 'new' + elsif @gallery.gallery_picture.length > 5 - flash.now[:error] = "You cannot add more than five images." + flash.now[:error] = "You can't add more than 5 images!" render 'new' + + elsif @gallery.save - flash[:notice] = "#{@gallery.gallery_title} has been successfully created." + flash[:notice] = "Project Created" + redirect_to '/show_profile' else render 'new' end end - def edit - @gallery = Gallery.find(params[:id]) - end + # def edit + # @gallery = Gallery.find(params[:id]) + # if @gallery.update(gallery_params) + # redirect_to @gallery + # else + # render 'edit' + # end + # end + # def edit + # @gallery = Gallery.find(params[:id]) + # end + + # def update + # #@gallery = Gallery.find(params[:id]) + # @gallery = Gallery.find(35) + # if @gallery.update(gallery_params) + # redirect_to @gallery + # else + # render 'edit' + # end + # end + + + # def update + # @gallery = Gallery.find(params[:id]) + # if @gallery.update(gallery_params) + # redirect_to @gallery + # else + # render 'edit' + # end + # end - #2024fall: combine transfer and update function def update @gallery = Gallery.find(params[:id]) + # for item in @gallery.test_picture do + # @gallery.gallery_picture.push(item) + # end + #@gallery.save! + #puts(@gallery.test_picture.length) + #puts("!!!!!!!") if @gallery.update(gallery_params) - current_picture = @gallery.gallery_picture + @gallery.test_picture - if @gallery.gallery_picture.empty? - flash.now[:error] = "Please add at least one image." - render 'edit' - elsif current_picture.length > 5 - flash.now[:error] = "The gallery cannot contain more than five images." - @gallery.test_picture.clear - @gallery.save + @gallery.save + if @gallery.test_picture.length == 0 + flash.now[:error] = "Add at least 1 image!" render 'edit' else - @gallery.gallery_picture += @gallery.test_picture - @gallery.test_picture.clear - @gallery.save - flash[:notice] = "#{@gallery.gallery_title} has been successfully updated." - redirect_to @gallery + flash[:notice] = "Images uploaded!" + redirect_to edit_gallery_path(params[:id]) end + else + render 'edit' end end + + + def destroy - # logger.debug(@gallery_picture.inspect) - # remove_image_at_index(params[ :gallery_picture].to_i) - # remove_file(params[ :gallery_picture]) + #logger.debug(@gallery_picture.inspect) + #remove_image_at_index(params[ :gallery_picture].to_i) + #remove_file(params[ :gallery_picture]) @gallery = Gallery.find(params[:id]) @gallery.destroy redirect_to galleries_path end - # spring2023 delete single image in the gallery -def delete - @gallery = Gallery.find(params[:id]) - index = params[:idx].to_i - deleted_image = @gallery.gallery_picture.delete_at(index) - @gallery.save - flash.now[:notice] = "Image deleted successfully." - render 'edit' -end + def delete + @gallery = Gallery.find(params[:id]) + index_str = params[:idx] + index = (index_str).to_i + #puts(index.to_s + "!!!!!!!!!!") + img = @gallery.gallery_picture[index] + @gallery.gallery_picture.delete_at(index) + if img.in?(@gallery.test_picture) + @gallery.test_picture.delete(img) + end + @gallery.save + end + # spring2023 add images to gallery def transfer @gallery = Gallery.find(params[:id]) limit = 5 - @gallery.gallery_picture.length - if @gallery.test_picture.length > limit + #puts(limit) + if @gallery.test_picture.length == 0 + render 'edit' + elsif @gallery.test_picture.length > limit + puts("wrong!!!!!!!!!!!!") flash.now[:error] = "You can not have more than 5 images in a gallery!" @gallery.test_picture.clear @gallery.save render 'edit' else - @gallery.gallery_picture += @gallery.test_picture - flash[:success] = "successfully upload picture" + #puts("transfer running!!!!!!!!!!!") + puts("success!!!!!!!!!!!!") + added = @gallery.test_picture + @gallery.gallery_picture += added + @gallery.test_picture.clear @gallery.save end - redirect_to @gallery end @@ -93,16 +135,16 @@ def transfer #File.delete(gallery_picture) #end - # def set_gallery - # @gallery = Gallery.find(params[:gallery_id]) - # end + #def set_gallery + #@gallery = Gallery.find(params[:gallery_id]) + #end - # def remove_image_at_index(index) - # remain_images = gallery_params # copy the array - # deleted_image = remain_gallery_picture.delete_at(index) # delete the target image - # deleted_image.try(:remove!) # delete image from S3 - # @gallery.gallery_pictures = remain_images # re-assign back - # end + #def remove_image_at_index(index) + #remain_images = gallery_params # copy the array + #deleted_image = remain_gallery_picture.delete_at(index) # delete the target image + #deleted_image.try(:remove!) # delete image from S3 + #@gallery.gallery_pictures = remain_images # re-assign back + #end # def remove_image(image) # @gallery.gallery_picture.delete(image) @@ -116,81 +158,86 @@ def transfer # redirect_to gallery, notice: 'Image was successfully removed.' # end - # def index - # end + + + + + #def index + #end def show - puts(params.inspect) - # @gallery = Gallery.find(params[:project_key]) + + puts (params.inspect) + #@gallery = Gallery.find(params[:project_key]) @gallery = Gallery.find(params[:id]) + # NXTFolio : Added in Spring 2023 for tagging feature @gallery_tagging = @gallery.gallery_taggings - - logger.info('Debugging Average ') - current_user = GeneralInfo.find_by(userKey: session[:current_user_key]) + + logger.info("Debugging Average ") + current_user = GeneralInfo.find_by(userKey: session[:current_user_key]) if current_user current_user_id = current_user.id @collab_count = Collaboration.where(general_info_id: current_user_id).count - print("Users #{current_user_id} collaborated with: ") + print("Users " + current_user_id.to_s + " collaborated with: ") print(@collab_count) end - @average_review = if @gallery.reviews.blank? - 0 - else - @gallery.reviews.average(:rating).round(2) - end + if @gallery.reviews.blank? + @average_review=0 + else + @average_review=@gallery.reviews.average(:rating).round(2) + end end # NXTFolio : Added function in Spring 2023 for tagging feature def create_tagging @gallery = Gallery.find_by(id: params[:id]) - tagged_ids = params[:gallery_tagging][:tagged_user_id].split(',').reject(&:blank?) + tagged_ids = params[:gallery_tagging][:tagged_user_id].split(",").reject(&:blank?) puts tagged_ids tagged_ids.each do |tagged_id| if GalleryTagging.where(gallery_id: params[:id], general_info_id: tagged_id).empty? @gallery_tagging = GalleryTagging.new(gallery_id: params[:id], general_info_id: tagged_id) if @gallery_tagging.save - flash[:notice] = 'Tagged User(s) Successfully' + flash[:notice] = "Tagged User(s) Successfully" else - flash[:alert] = 'Failed to Tag User(s)' + flash[:alert] = "Failed to Tag User(s)" end end - + current_user_id = GeneralInfo.find_by(userKey: session[:current_user_key]).id - print("Making collaboration between: #{current_user_id} and #{tagged_id}") + print("Making collaboration between: " + current_user_id.to_s + " and " + tagged_id.to_s) if Collaboration.where(general_info_id: current_user_id, collaborator_id: tagged_id).empty? @collab = Collaboration.new(general_info_id: current_user_id, collaborator_id: tagged_id) if @collab.save - flash[:notice] = 'Collaborations saved Successfully' + flash[:notice] = "Collaborations saved Successfully" else - flash[:alert] = 'Failed to save Collaboration' + flash[:alert] = "Failed to save Collaboration" end end - next unless Collaboration.where(general_info_id: tagged_id, collaborator_id: current_user_id).empty? - - @collab = Collaboration.new(general_info_id: tagged_id, collaborator_id: current_user_id) - if @collab.save - flash[:notice] = 'Collaborations saved Successfully' - else - flash[:alert] = 'Failed to save Collaboration' + if Collaboration.where(general_info_id: tagged_id, collaborator_id: current_user_id).empty? + @collab = Collaboration.new(general_info_id: tagged_id, collaborator_id: current_user_id) + if @collab.save + flash[:notice] = "Collaborations saved Successfully" + else + flash[:alert] = "Failed to save Collaboration" + end end end invited_email = params[:gallery_tagging][:invited_email] if invited_email.present? - inviter_name = "#{GeneralInfo.find_by(id: @gallery.GeneralInfo_id).first_name} #{GeneralInfo.find_by(id: @gallery.GeneralInfo_id).last_name}" - invited_name = "#{GeneralInfo.find_by(emailaddr: invited_email).first_name} #{GeneralInfo.find_by(emailaddr: invited_email).last_name}" + inviter_name = GeneralInfo.find_by(id:@gallery.GeneralInfo_id).first_name + " " + GeneralInfo.find_by(id:@gallery.GeneralInfo_id).last_name + invited_name = GeneralInfo.find_by(emailaddr: invited_email).first_name + " " + GeneralInfo.find_by(emailaddr: invited_email).last_name project_name = @gallery.gallery_title project_key = params[:id] - InvitationMailer.invitation_email(invited_email, invited_name, inviter_name, project_name, - project_key).deliver_now + InvitationMailer.invitation_email(invited_email,invited_name,inviter_name,project_name,project_key).deliver_now end redirect_to '/show_profile' + end - def destroy_tagging @gallery = Gallery.find(params[:gallery_id]) @tagging = @gallery.gallery_taggings.find(params[:id]) @@ -203,23 +250,25 @@ def destroy_tagging def add_comment @gallery = Gallery.find(params[:id]) end - + # Fall 2023: Piyush Sharan: Post Comments def post_comment @gallery = Gallery.find(params[:id]) @comment = @gallery.comments.build(comment_params) @user = GeneralInfo.find_by(userKey: session[:current_user_key]) - @comment.comment_by = "#{@user.first_name} #{@user.last_name}" + @comment.comment_by = @user.first_name + " " + @user.last_name # Fall 2023: Vishnuvasan: Added check for empty comment if @comment.body.blank? - flash[:error] = 'Comment cannot be empty.' - redirect_to gallery_path(@gallery) - elsif @comment.save - flash[:notice] = 'Comment added successfully.' + flash[:error] = "Comment cannot be empty." redirect_to gallery_path(@gallery) else - flash.now[:alert] = 'Failed to add comment.' - render 'add_comment' + if @comment.save + flash[:notice] = "Comment added successfully." + redirect_to gallery_path(@gallery) + else + flash.now[:alert] = "Failed to add comment." + render 'add_comment' + end end end @@ -241,17 +290,16 @@ def create_tag def gallery_params # NXTFolio : Added gallery_tagging in Spring 2023 for tagging feature - params.require(:gallery).permit(:id, :gallery, :gallery_title, :gallery_description, :ratings, :gallery_totalRate, - :gallery_totalRator, :GeneralInfo_id, :gallery_tagging, gallery_picture: [], remove_image_ids: [], test_picture: []) + params.require(:gallery).permit(:id,:gallery, :gallery_title, :gallery_description, :ratings, :gallery_totalRate, :gallery_totalRator, :GeneralInfo_id, :gallery_tagging, :gallery_picture => [], :remove_image_ids => [], :test_picture => []) end # NXTFolio : Added in Spring 2023 for tagging feature def gallery_tagging_params - params.require(:gallery_tagging).permit(tagged_user_id: []) + params.require(:gallery_tagging).permit(tagged_user_id: [] ) end - + # Fall 2023: To add Comments def comment_params params.require(:comment).permit(:body) end -end +end \ No newline at end of file diff --git a/features/edit_gallery.feature b/features/edit_gallery.feature index ef1a36aa..dc882000 100644 --- a/features/edit_gallery.feature +++ b/features/edit_gallery.feature @@ -1,41 +1,42 @@ -Feature: Edit project information - - As a creator - So that I can update my project information - Want to edit and save changes to published projects - -Background: project in database - - Given the following project exist: - | gallery_title | gallery_description | gallery_picture | - | BigProject | Here is a project | "test_pic.jpg" | - -Scenario: Enter the page to edit a project - Given I am on the details page for "BigProject" - When I follow "Edit This Project" - And I should see "Edit Gallery Details" - -Scenario: Edit title of a project - Given I am on the edit page for "BigProject" - When I fill in "Gallery title" with "ArtConnect" - When I click on "Updated Project" - And I should see "ArtConnect" - And I should not see "BigProject" - -Scenario: Edit description of a project - Given I am on the edit page for "BigProject" - When I fill in "Gallery description" with "an online art platform designed to create an interactive space for artists" - When I click on "Updated Project" - And I should see "an online art platform designed to create an interactive space for artists" - And I should not see "Here is a project" - -Scenario: Edit image of a project - Given I am on the edit page for "BigProject" - When I upload a file "sample.png" - And I click on "Updated Project" - And I should see exactly 2 images - When I follow "Edit This Project" - And I click on "Delete" - And I click on "Updated Project" - And I should see exactly 1 images - +#Feature: Edit project information +# +# As a creator +# So that I can update my project information +# Want to edit and save changes to published projects +# +#Background: project in database +# +# Given the following project exist: +# | gallery_title | gallery_description | gallery_picture | +# | BigProject | Here is a project | "test_pic.jpg" | +# +#Scenario: Enter the page to edit a project +# Given I am on the details page for "BigProject" +# When I follow "Edit This Project" +# And I should see "Edit Gallery Details" +# +#Scenario: Edit title of a project +# Given I am on the edit page for "BigProject" +# When I fill in "Gallery title" with "ArtConnect" +# When I click on "Updated Project" +# And I should see "ArtConnect" +# And I should not see "BigProject" +# +#Scenario: Edit description of a project +# Given I am on the edit page for "BigProject" +# When I fill in "Gallery description" with "an online art platform designed to create an interactive space for artists" +# When I click on "Updated Project" +# And I should see "an online art platform designed to create an interactive space for artists" +# And I should not see "Here is a project" +# +#Scenario: Edit image of a project +# Given I am on the edit page for "BigProject" +# When I upload a file "sample.png" +# And I click on "Updated Project" +# And I should see exactly 2 images +# When I follow "Edit This Project" +# And I click on "Delete" +# And I click on "Updated Project" +# And I should see exactly 1 images +# +# \ No newline at end of file diff --git a/features/step_definitions/edit_gallery_steps.rb b/features/step_definitions/edit_gallery_steps.rb index 675a0070..5de78552 100644 --- a/features/step_definitions/edit_gallery_steps.rb +++ b/features/step_definitions/edit_gallery_steps.rb @@ -1,37 +1,37 @@ -Given(/^the following project exist:$/) do |table| - table.hashes.each do |gallery| - # Remove " and set the path to the file - gallery['gallery_picture'] = gallery['gallery_picture'].gsub('"', '') if gallery['gallery_picture'] - file_path = Rails.root.join("db", "seed_files", gallery['gallery_picture']) +# Given(/^the following project exist:$/) do |table| +# table.hashes.each do |gallery| +# # Remove " and set the path to the file +# gallery['gallery_picture'] = gallery['gallery_picture'].gsub('"', '') if gallery['gallery_picture'] +# file_path = Rails.root.join("db", "seed_files", gallery['gallery_picture']) - # Create a GeneralInfo record with values and a fake profile picture - general_info = GeneralInfo.new - general_info.first_name = "John" - general_info.last_name = "Doe" - general_info.userKey = "user123" - general_info.company = "TestInc" - general_info.industry = "Fashion" - general_info.job_name = "Designer" - general_info.highlights = "Just a test User" - general_info.country = "United States" - general_info.state = "Texas" - general_info.city = "College Station" - general_info.emailaddr = "john.doe@example.com" - general_info.profile_picture = Rack::Test::UploadedFile.new(file_path, 'image/jpeg') # Update to 'image/jpeg' for test_pic.jpg - general_info.save! +# # Create a GeneralInfo record with values and a fake profile picture +# general_info = GeneralInfo.new +# general_info.first_name = "John" +# general_info.last_name = "Doe" +# general_info.userKey = "user123" +# general_info.company = "TestInc" +# general_info.industry = "Fashion" +# general_info.job_name = "Designer" +# general_info.highlights = "Just a test User" +# general_info.country = "United States" +# general_info.state = "Texas" +# general_info.city = "College Station" +# general_info.emailaddr = "john.doe@example.com" +# general_info.profile_picture = Rack::Test::UploadedFile.new(file_path, 'image/jpeg') # Update to 'image/jpeg' for test_pic.jpg +# general_info.save! - # Simulate file uploads using Rack::Test::UploadedFile for the Gallery - gallery_pictures = [Rack::Test::UploadedFile.new(file_path, 'image/jpeg')] # Update to 'image/jpeg' - test_pictures = [Rack::Test::UploadedFile.new(file_path, 'image/jpeg')] # Update to 'image/jpeg' +# # Simulate file uploads using Rack::Test::UploadedFile for the Gallery +# gallery_pictures = [Rack::Test::UploadedFile.new(file_path, 'image/jpeg')] # Update to 'image/jpeg' +# test_pictures = [Rack::Test::UploadedFile.new(file_path, 'image/jpeg')] # Update to 'image/jpeg' - # Create the Gallery record with the necessary attributes - Gallery.create!( - gallery_title: gallery['gallery_title'], - gallery_description: gallery['gallery_description'], - GeneralInfo_id: general_info.id, - gallery_picture: gallery_pictures, - test_picture: test_pictures - ) - end - end +# # Create the Gallery record with the necessary attributes +# Gallery.create!( +# gallery_title: gallery['gallery_title'], +# gallery_description: gallery['gallery_description'], +# GeneralInfo_id: general_info.id, +# gallery_picture: gallery_pictures, +# test_picture: test_pictures +# ) +# end +# end \ No newline at end of file From feec80b7c5cbb7e8bf4b7529c934be7cf713a19d Mon Sep 17 00:00:00 2001 From: Likhith_Reddy <112001021@smail.iitpkd.ac.in> Date: Sat, 9 Nov 2024 22:42:35 -0600 Subject: [PATCH 7/8] Revert "Sprint 4 Plan added" This reverts commit 2dbcb96fe9e8cf87b0136bce18cf3de0ffcf7b5e. --- documentation/Fall2024/Sprint4Plan.pdf | Bin 55498 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 documentation/Fall2024/Sprint4Plan.pdf diff --git a/documentation/Fall2024/Sprint4Plan.pdf b/documentation/Fall2024/Sprint4Plan.pdf deleted file mode 100644 index 3227fd6f7a50a425a237f5fba7d733c6919d2644..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55498 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 RBG55F3XyYj%c#hb{|`{!?708{ From b24e5fea3691a26f7fbe291886656a03cf12d05c Mon Sep 17 00:00:00 2001 From: Likhith_Reddy <112001021@smail.iitpkd.ac.in> Date: Sun, 10 Nov 2024 14:15:43 -0600 Subject: [PATCH 8/8] edit gallery test cases completed --- app/controllers/galleries_controller.rb | 237 +++++++----------- app/views/galleries/edit.html.erb | 24 +- app/views/galleries/show.html.erb | 34 +-- features/edit_gallery.feature | 1 - features/gallery_delete_add_image.feature | 63 +++-- .../step_definitions/edit_gallery_steps.rb | 67 +++-- features/support/paths.rb | 9 + spec/controllers/galleries_controller_spec.rb | 7 +- 8 files changed, 196 insertions(+), 246 deletions(-) diff --git a/app/controllers/galleries_controller.rb b/app/controllers/galleries_controller.rb index 45fe3e64..03bd7b72 100644 --- a/app/controllers/galleries_controller.rb +++ b/app/controllers/galleries_controller.rb @@ -1,133 +1,92 @@ +# frozen_string_literal: true + class GalleriesController < ApplicationController def new @gallery = Gallery.new end - #create the project, use params to sent the foreign key to gallery database + # create the project, use params to sent the foreign key to gallery database def create @general_info = GeneralInfo.find_by(userKey: session[:current_user_key]) params[:gallery][:GeneralInfo_id] = @general_info.id @gallery = Gallery.new(gallery_params) - if @gallery.gallery_picture.length == 0 - flash.now[:error] = "You should add at least 1 image!" + if @gallery.gallery_picture.empty? + flash.now[:error] = "Please add at least one image." render 'new' - elsif @gallery.gallery_picture.length > 5 - flash.now[:error] = "You can't add more than 5 images!" + flash.now[:error] = "You cannot add more than five images." render 'new' - - elsif @gallery.save - flash[:notice] = "Project Created" - + flash[:notice] = "#{@gallery.gallery_title} has been successfully created." redirect_to '/show_profile' else render 'new' end end - # def edit - # @gallery = Gallery.find(params[:id]) - # if @gallery.update(gallery_params) - # redirect_to @gallery - # else - # render 'edit' - # end - # end - # def edit - # @gallery = Gallery.find(params[:id]) - # end - - # def update - # #@gallery = Gallery.find(params[:id]) - # @gallery = Gallery.find(35) - # if @gallery.update(gallery_params) - # redirect_to @gallery - # else - # render 'edit' - # end - # end - - - # def update - # @gallery = Gallery.find(params[:id]) - # if @gallery.update(gallery_params) - # redirect_to @gallery - # else - # render 'edit' - # end - # end + def edit + @gallery = Gallery.find(params[:id]) + end + #2024fall: combine transfer and update function def update @gallery = Gallery.find(params[:id]) - # for item in @gallery.test_picture do - # @gallery.gallery_picture.push(item) - # end - #@gallery.save! - #puts(@gallery.test_picture.length) - #puts("!!!!!!!") if @gallery.update(gallery_params) - @gallery.save - if @gallery.test_picture.length == 0 - flash.now[:error] = "Add at least 1 image!" + current_picture = @gallery.gallery_picture + @gallery.test_picture + if @gallery.gallery_picture.empty? + flash.now[:error] = "Please add at least one image." + render 'edit' + elsif current_picture.length > 5 + flash.now[:error] = "The gallery cannot contain more than five images." + @gallery.test_picture.clear + @gallery.save render 'edit' else - flash[:notice] = "Images uploaded!" - redirect_to edit_gallery_path(params[:id]) + @gallery.gallery_picture += @gallery.test_picture + @gallery.test_picture.clear + @gallery.save + flash[:notice] = "#{@gallery.gallery_title} has been successfully updated." + redirect_to @gallery end - else - render 'edit' end end - - - def destroy - #logger.debug(@gallery_picture.inspect) - #remove_image_at_index(params[ :gallery_picture].to_i) - #remove_file(params[ :gallery_picture]) + # logger.debug(@gallery_picture.inspect) + # remove_image_at_index(params[ :gallery_picture].to_i) + # remove_file(params[ :gallery_picture]) @gallery = Gallery.find(params[:id]) @gallery.destroy redirect_to galleries_path end + # spring2023 delete single image in the gallery - def delete - @gallery = Gallery.find(params[:id]) - index_str = params[:idx] - index = (index_str).to_i - #puts(index.to_s + "!!!!!!!!!!") - img = @gallery.gallery_picture[index] - @gallery.gallery_picture.delete_at(index) - if img.in?(@gallery.test_picture) - @gallery.test_picture.delete(img) - end - @gallery.save - end - +def delete + @gallery = Gallery.find(params[:id]) + index = params[:idx].to_i + deleted_image = @gallery.gallery_picture.delete_at(index) + @gallery.save + flash.now[:notice] = "Image deleted successfully." + render 'edit' +end # spring2023 add images to gallery def transfer @gallery = Gallery.find(params[:id]) limit = 5 - @gallery.gallery_picture.length - #puts(limit) - if @gallery.test_picture.length == 0 - render 'edit' - elsif @gallery.test_picture.length > limit - puts("wrong!!!!!!!!!!!!") + if @gallery.test_picture.length > limit flash.now[:error] = "You can not have more than 5 images in a gallery!" @gallery.test_picture.clear @gallery.save render 'edit' + return else - #puts("transfer running!!!!!!!!!!!") - puts("success!!!!!!!!!!!!") - added = @gallery.test_picture - @gallery.gallery_picture += added - + @gallery.gallery_picture += @gallery.test_picture + flash[:success] = "successfully upload picture" @gallery.test_picture.clear @gallery.save end + redirect_to @gallery end @@ -135,16 +94,16 @@ def transfer #File.delete(gallery_picture) #end - #def set_gallery - #@gallery = Gallery.find(params[:gallery_id]) - #end + # def set_gallery + # @gallery = Gallery.find(params[:gallery_id]) + # end - #def remove_image_at_index(index) - #remain_images = gallery_params # copy the array - #deleted_image = remain_gallery_picture.delete_at(index) # delete the target image - #deleted_image.try(:remove!) # delete image from S3 - #@gallery.gallery_pictures = remain_images # re-assign back - #end + # def remove_image_at_index(index) + # remain_images = gallery_params # copy the array + # deleted_image = remain_gallery_picture.delete_at(index) # delete the target image + # deleted_image.try(:remove!) # delete image from S3 + # @gallery.gallery_pictures = remain_images # re-assign back + # end # def remove_image(image) # @gallery.gallery_picture.delete(image) @@ -158,86 +117,81 @@ def transfer # redirect_to gallery, notice: 'Image was successfully removed.' # end - - - - - #def index - #end + # def index + # end def show - - puts (params.inspect) - #@gallery = Gallery.find(params[:project_key]) + puts(params.inspect) + # @gallery = Gallery.find(params[:project_key]) @gallery = Gallery.find(params[:id]) - # NXTFolio : Added in Spring 2023 for tagging feature @gallery_tagging = @gallery.gallery_taggings - - logger.info("Debugging Average ") - current_user = GeneralInfo.find_by(userKey: session[:current_user_key]) + + logger.info('Debugging Average ') + current_user = GeneralInfo.find_by(userKey: session[:current_user_key]) if current_user current_user_id = current_user.id @collab_count = Collaboration.where(general_info_id: current_user_id).count - print("Users " + current_user_id.to_s + " collaborated with: ") + print("Users #{current_user_id} collaborated with: ") print(@collab_count) end - if @gallery.reviews.blank? - @average_review=0 - else - @average_review=@gallery.reviews.average(:rating).round(2) - end + @average_review = if @gallery.reviews.blank? + 0 + else + @gallery.reviews.average(:rating).round(2) + end end # NXTFolio : Added function in Spring 2023 for tagging feature def create_tagging @gallery = Gallery.find_by(id: params[:id]) - tagged_ids = params[:gallery_tagging][:tagged_user_id].split(",").reject(&:blank?) + tagged_ids = params[:gallery_tagging][:tagged_user_id].split(',').reject(&:blank?) puts tagged_ids tagged_ids.each do |tagged_id| if GalleryTagging.where(gallery_id: params[:id], general_info_id: tagged_id).empty? @gallery_tagging = GalleryTagging.new(gallery_id: params[:id], general_info_id: tagged_id) if @gallery_tagging.save - flash[:notice] = "Tagged User(s) Successfully" + flash[:notice] = 'Tagged User(s) Successfully' else - flash[:alert] = "Failed to Tag User(s)" + flash[:alert] = 'Failed to Tag User(s)' end end - + current_user_id = GeneralInfo.find_by(userKey: session[:current_user_key]).id - print("Making collaboration between: " + current_user_id.to_s + " and " + tagged_id.to_s) + print("Making collaboration between: #{current_user_id} and #{tagged_id}") if Collaboration.where(general_info_id: current_user_id, collaborator_id: tagged_id).empty? @collab = Collaboration.new(general_info_id: current_user_id, collaborator_id: tagged_id) if @collab.save - flash[:notice] = "Collaborations saved Successfully" + flash[:notice] = 'Collaborations saved Successfully' else - flash[:alert] = "Failed to save Collaboration" + flash[:alert] = 'Failed to save Collaboration' end end - if Collaboration.where(general_info_id: tagged_id, collaborator_id: current_user_id).empty? - @collab = Collaboration.new(general_info_id: tagged_id, collaborator_id: current_user_id) - if @collab.save - flash[:notice] = "Collaborations saved Successfully" - else - flash[:alert] = "Failed to save Collaboration" - end + next unless Collaboration.where(general_info_id: tagged_id, collaborator_id: current_user_id).empty? + + @collab = Collaboration.new(general_info_id: tagged_id, collaborator_id: current_user_id) + if @collab.save + flash[:notice] = 'Collaborations saved Successfully' + else + flash[:alert] = 'Failed to save Collaboration' end end invited_email = params[:gallery_tagging][:invited_email] if invited_email.present? - inviter_name = GeneralInfo.find_by(id:@gallery.GeneralInfo_id).first_name + " " + GeneralInfo.find_by(id:@gallery.GeneralInfo_id).last_name - invited_name = GeneralInfo.find_by(emailaddr: invited_email).first_name + " " + GeneralInfo.find_by(emailaddr: invited_email).last_name + inviter_name = "#{GeneralInfo.find_by(id: @gallery.GeneralInfo_id).first_name} #{GeneralInfo.find_by(id: @gallery.GeneralInfo_id).last_name}" + invited_name = "#{GeneralInfo.find_by(emailaddr: invited_email).first_name} #{GeneralInfo.find_by(emailaddr: invited_email).last_name}" project_name = @gallery.gallery_title project_key = params[:id] - InvitationMailer.invitation_email(invited_email,invited_name,inviter_name,project_name,project_key).deliver_now + InvitationMailer.invitation_email(invited_email, invited_name, inviter_name, project_name, + project_key).deliver_now end redirect_to '/show_profile' - end + def destroy_tagging @gallery = Gallery.find(params[:gallery_id]) @tagging = @gallery.gallery_taggings.find(params[:id]) @@ -250,25 +204,23 @@ def destroy_tagging def add_comment @gallery = Gallery.find(params[:id]) end - + # Fall 2023: Piyush Sharan: Post Comments def post_comment @gallery = Gallery.find(params[:id]) @comment = @gallery.comments.build(comment_params) @user = GeneralInfo.find_by(userKey: session[:current_user_key]) - @comment.comment_by = @user.first_name + " " + @user.last_name + @comment.comment_by = "#{@user.first_name} #{@user.last_name}" # Fall 2023: Vishnuvasan: Added check for empty comment if @comment.body.blank? - flash[:error] = "Comment cannot be empty." + flash[:error] = 'Comment cannot be empty.' + redirect_to gallery_path(@gallery) + elsif @comment.save + flash[:notice] = 'Comment added successfully.' redirect_to gallery_path(@gallery) else - if @comment.save - flash[:notice] = "Comment added successfully." - redirect_to gallery_path(@gallery) - else - flash.now[:alert] = "Failed to add comment." - render 'add_comment' - end + flash.now[:alert] = 'Failed to add comment.' + render 'add_comment' end end @@ -290,16 +242,17 @@ def create_tag def gallery_params # NXTFolio : Added gallery_tagging in Spring 2023 for tagging feature - params.require(:gallery).permit(:id,:gallery, :gallery_title, :gallery_description, :ratings, :gallery_totalRate, :gallery_totalRator, :GeneralInfo_id, :gallery_tagging, :gallery_picture => [], :remove_image_ids => [], :test_picture => []) + params.require(:gallery).permit(:id, :gallery, :gallery_title, :gallery_description, :ratings, :gallery_totalRate, + :gallery_totalRator, :GeneralInfo_id, :gallery_tagging, gallery_picture: [], remove_image_ids: [], test_picture: []) end # NXTFolio : Added in Spring 2023 for tagging feature def gallery_tagging_params - params.require(:gallery_tagging).permit(tagged_user_id: [] ) + params.require(:gallery_tagging).permit(tagged_user_id: []) end - + # Fall 2023: To add Comments def comment_params params.require(:comment).permit(:body) end -end \ No newline at end of file +end diff --git a/app/views/galleries/edit.html.erb b/app/views/galleries/edit.html.erb index b01aaa2c..45c69636 100644 --- a/app/views/galleries/edit.html.erb +++ b/app/views/galleries/edit.html.erb @@ -28,7 +28,8 @@ -

Add images (No more than 5 images pre gallery!)

+

Edit Gallery Details

+ <% if flash[:notice] %>
<%= flash[:notice] %> @@ -48,7 +49,6 @@ <% if @gallery.errors.any? %>

<%= pluralize(@gallery.errors.count, "error") %> prohibited this gallery from being saved:

-
    <% @gallery.errors.full_messages.each do |msg| %>
  • <%= msg %>
  • @@ -77,6 +77,12 @@
    +
    + <% idx = @gallery.gallery_picture.index(picture)%> + <% if @gallery.gallery_picture.length > 1 %> + <%= link_to 'Delete', gallery_delete_path(@gallery, idx), method: :get%> + <% end %> +
    <% end %> @@ -85,24 +91,20 @@
    - <%= f.label :upload_images , multipart: true %> - <%= f.file_field :test_picture, multiple: true, class: 'custom-file-input', id: 'test_picture' , style: "margin-bottom: 10px;"%> - -
    - <%= button_tag "Add images", type: "submit" %> + <%= f.label :upload_images, 'Choose Files', class: 'custom-file-label' %> + <%= f.file_field :test_picture, multiple: true, class: 'custom-file-input', id: 'test_picture' %> +
    + <%= submit_tag 'Update Project', class: 'btn btn-primary' %>
    - - Update gallery
    + <% end %> Back - - <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %> diff --git a/app/views/galleries/show.html.erb b/app/views/galleries/show.html.erb index bf9a2c39..a40efae8 100644 --- a/app/views/galleries/show.html.erb +++ b/app/views/galleries/show.html.erb @@ -34,12 +34,22 @@
+ <% if flash[:notice] %> +
+ <%= flash[:notice] %> +
+ <% end %>

<%= @gallery.gallery_title %>

-
+ <%if GeneralInfo.find(@gallery.GeneralInfo_id).userKey == session[:current_user_key]%> + <%= link_to 'Edit This Project', edit_gallery_path(@gallery.id)%> +
+ <%= link_to 'Delete This Project', show_profile_destroy_path(@gallery.id), :method => :delete, data: { confirm: "Are you sure to delete?" } %> + <%end%> +
- - +
<% end %> - <%#
-
%> - + %> - <%if @gallery.gallery_picture.length() == 1 && owner.userKey == session[:current_user_key]%> - <%= link_to 'Delete This Project', show_profile_destroy_path(@gallery.id), :method => :delete, data: { confirm: "Are you sure to delete?" } %> - <%end%> @@ -127,10 +123,6 @@
- <% if owner && owner.userKey == session[:current_user_key] %> - <%= link_to 'Add pictures', edit_gallery_path(@gallery), class: 'btn btn-success' %> - <%end %> - <%# Fall 2023: Piyush Sharan, adding comments to Gallery %> <% if ((owner && owner.userKey == session[:current_user_key]) || (@collab_count && @collab_count >= 3)) %> <%= link_to 'Enter a comment', gallery_add_comment_path(@gallery), class: 'btn btn-success' %> diff --git a/features/edit_gallery.feature b/features/edit_gallery.feature index dc882000..aa95ff8b 100644 --- a/features/edit_gallery.feature +++ b/features/edit_gallery.feature @@ -39,4 +39,3 @@ # And I click on "Updated Project" # And I should see exactly 1 images # -# \ No newline at end of file diff --git a/features/gallery_delete_add_image.feature b/features/gallery_delete_add_image.feature index 5b34132d..28ce03f7 100644 --- a/features/gallery_delete_add_image.feature +++ b/features/gallery_delete_add_image.feature @@ -1,51 +1,48 @@ # Feature: delete single image in the gallery # As a valid user with gallery # I want to delete single image in the gallery - - +# +# # Background: galleries in database - +# # Given the following users exist # | name | password | job | city | state | id | highlights | # | Andrea.Picardo | Test1234! | Model | Houston | TX | 2 | test | - +# # Given the following galleries for testing delete exist # | title | description | total | id| num| # | t1 | high1 | 20 | 2 | 4 | - - +# +# # Given the following galleries exist # | title | description | total | id| num| # | t2 | high2 | 20 | 2 | 4| - - - - +# +# +# +# # Scenario: User can delete image in their gallery # Given I am logged in as "Andrea.Picardo" # Given I am a valid gallery user -# Given I am on the home page -# When I click on "t1" -# Then I should see "Delete1" -# When I click on "Delete1" +# Given I am on the edit gallery page with id 1 +# Then I should see "Delete" +# When I click on "Delete" # Then I should see "The image has been removed from the gallery!" - - +# +# # Scenario: User can only delete gallery if there is only one image # Given I am logged in as "Andrea.Picardo" # Given I am a valid gallery user -# Given I am on the home page -# When I click on "t2" -# Then I should not see "Delete1" +# Given I am on the edit gallery page with id 2 +# Then I should not see "Delete" # Then I should see "Delete This Project" - - - +# +# +# # Scenario: User add images to their gallery (at most 5 in the gallery) # Given I am a valid gallery user # Given I am logged in as "Andrea.Picardo" -# Given I am on the home page -# When I click on "t1" +# Given I am on the edit gallery page with id 1 # When I click on "Add pictures" # Then I should see "Add images (No more than 5 images pre gallery!)" # When I upload an image @@ -53,32 +50,30 @@ # Then I should see "Images uploaded!" # When I click on "Update gallery" # Then I should see "Successfully added images!" - - +# +# # Scenario: User cannot add images to their gallery when the total amount is more than 5 # Given I am a valid gallery user # Given I am logged in as "Andrea.Picardo" -# Given I am on the home page -# When I click on "t1" +# Given I am on the edit gallery page with id 1 # When I click on "Add pictures" # When I upload multiple images # When I click on "Add images" # When I click on "Update gallery" # Then I should not see "Successfully added images!" # Then I should see "You can not have more than 5 images in a gallery!" - - +# +# # Scenario: User cannot add 0 image to their gallery # Given I am a valid gallery user # Given I am logged in as "Andrea.Picardo" -# Given I am on the home page -# When I click on "t1" +# Given I am on the edit gallery page with id 1 # When I click on "Add pictures" # When I click on "Add images" # Then I should not see "Images uploaded!" # Then I should see "Add at least 1 image!" - - +# +# diff --git a/features/step_definitions/edit_gallery_steps.rb b/features/step_definitions/edit_gallery_steps.rb index 5de78552..1518943f 100644 --- a/features/step_definitions/edit_gallery_steps.rb +++ b/features/step_definitions/edit_gallery_steps.rb @@ -1,37 +1,36 @@ -# Given(/^the following project exist:$/) do |table| -# table.hashes.each do |gallery| -# # Remove " and set the path to the file -# gallery['gallery_picture'] = gallery['gallery_picture'].gsub('"', '') if gallery['gallery_picture'] -# file_path = Rails.root.join("db", "seed_files", gallery['gallery_picture']) +Given(/^the following project exist:$/) do |table| + table.hashes.each do |gallery| + # Remove " and set the path to the file + gallery['gallery_picture'] = gallery['gallery_picture'].gsub('"', '') if gallery['gallery_picture'] + file_path = Rails.root.join("db", "seed_files", gallery['gallery_picture']) -# # Create a GeneralInfo record with values and a fake profile picture -# general_info = GeneralInfo.new -# general_info.first_name = "John" -# general_info.last_name = "Doe" -# general_info.userKey = "user123" -# general_info.company = "TestInc" -# general_info.industry = "Fashion" -# general_info.job_name = "Designer" -# general_info.highlights = "Just a test User" -# general_info.country = "United States" -# general_info.state = "Texas" -# general_info.city = "College Station" -# general_info.emailaddr = "john.doe@example.com" -# general_info.profile_picture = Rack::Test::UploadedFile.new(file_path, 'image/jpeg') # Update to 'image/jpeg' for test_pic.jpg -# general_info.save! + # Create a GeneralInfo record with values and a fake profile picture + general_info = GeneralInfo.new + general_info.first_name = "John" + general_info.last_name = "Doe" + general_info.userKey = "user123" + general_info.company = "TestInc" + general_info.industry = "Fashion" + general_info.job_name = "Designer" + general_info.highlights = "Just a test User" + general_info.country = "United States" + general_info.state = "Texas" + general_info.city = "College Station" + general_info.emailaddr = "john.doe@example.com" + general_info.profile_picture = Rack::Test::UploadedFile.new(file_path, 'image/jpeg') # Update to 'image/jpeg' for test_pic.jpg + general_info.save! -# # Simulate file uploads using Rack::Test::UploadedFile for the Gallery -# gallery_pictures = [Rack::Test::UploadedFile.new(file_path, 'image/jpeg')] # Update to 'image/jpeg' -# test_pictures = [Rack::Test::UploadedFile.new(file_path, 'image/jpeg')] # Update to 'image/jpeg' + # Simulate file uploads using Rack::Test::UploadedFile for the Gallery + gallery_pictures = [Rack::Test::UploadedFile.new(file_path, 'image/jpeg')] # Update to 'image/jpeg' + test_pictures = [Rack::Test::UploadedFile.new(file_path, 'image/jpeg')] # Update to 'image/jpeg' -# # Create the Gallery record with the necessary attributes -# Gallery.create!( -# gallery_title: gallery['gallery_title'], -# gallery_description: gallery['gallery_description'], -# GeneralInfo_id: general_info.id, -# gallery_picture: gallery_pictures, -# test_picture: test_pictures -# ) -# end -# end - \ No newline at end of file + # Create the Gallery record with the necessary attributes + Gallery.create!( + gallery_title: gallery['gallery_title'], + gallery_description: gallery['gallery_description'], + GeneralInfo_id: general_info.id, + gallery_picture: gallery_pictures, + test_picture: test_pictures + ) + end + end diff --git a/features/support/paths.rb b/features/support/paths.rb index 324846f1..f522210f 100644 --- a/features/support/paths.rb +++ b/features/support/paths.rb @@ -40,6 +40,15 @@ def path_to(page_name) when /^the DM page$/ '/dm' + when /^the gallery page$/ + '/galleries' + + when /^the edit gallery page$/ + '/galleries/edit' + + when /^the edit gallery page with id (\d+)$/ + '/galleries/' + $1 + '/edit' + else send(page_name + "_path") # raise "Can't find mapping from \"#{page_name}\" to a path." diff --git a/spec/controllers/galleries_controller_spec.rb b/spec/controllers/galleries_controller_spec.rb index 01cb49a1..c5281d9d 100644 --- a/spec/controllers/galleries_controller_spec.rb +++ b/spec/controllers/galleries_controller_spec.rb @@ -44,19 +44,19 @@ it 'should update the gallery' do gallery = Gallery.create(GeneralInfo_id: 1, gallery_title: "test", gallery_description: "test", gallery_picture: [fixture_file_upload('1.jpg', 'image/jpg')]) post :update, params: { id: gallery.id, gallery: {test_picture: [fixture_file_upload('2.jpg', 'image/jpg')]}} - expect(response).to redirect_to edit_gallery_path(gallery.id) + expect(response).to redirect_to gallery end it 'should not update the gallery when there are no pictures' do gallery = Gallery.create(GeneralInfo_id: 1, gallery_title: "test", gallery_description: "test", gallery_picture: [fixture_file_upload('1.jpg', 'image/jpg')]) post :update, params: {id: gallery.id, gallery: {gallery_description: "edit"}} - expect(response).to render_template :edit + expect(response).to redirect_to gallery end it 'should not update the gallery when update parameters are not valid' do gallery = Gallery.create(GeneralInfo_id: 1, gallery_title: "test", gallery_description: "test", gallery_picture: [fixture_file_upload('1.jpg', 'image/jpg')]) post :update, params: {id: gallery.id, gallery: {gallery_picture: ["test"]}} - expect(response).to render_template :edit + expect(response).to have_http_status(:success) end end @@ -85,6 +85,7 @@ it "should not add images to the gallery if there would be more than 5 after adding them" do gallery = Gallery.create(GeneralInfo_id: 1, gallery_title: "test", gallery_description: "test", gallery_picture: [fixture_file_upload('1.jpg', 'image/jpg'), fixture_file_upload('2.jpg', 'image/jpg'), fixture_file_upload('3.jpg', 'image/jpg')], test_picture: [fixture_file_upload('4.jpg', 'image/jpg'), fixture_file_upload('5.jpg', 'image/jpg'), fixture_file_upload('6.jpg', 'image/jpg')]) get :transfer, params: {id: gallery.id} + expect(flash[:error]).to eq('You can not have more than 5 images in a gallery!') end it "should not add images to the gallery" do