From c5169f1d156122dc88b5a1c1f47c142b9c3cb752 Mon Sep 17 00:00:00 2001 From: Gregory Ballantine Date: Wed, 29 Nov 2023 16:48:11 -0500 Subject: [PATCH] Added project model; added views for viewing and adding projects --- db/migrations/0004_add_projects_table.rb | 35 ++++++++++++++++ src/models/benchmark.rb | 6 +++ src/models/hardware.rb | 6 +++ src/models/init.rb | 3 +- src/models/project.rb | 21 ++++++++++ src/models/test.rb | 6 +++ src/routes/init.rb | 3 +- src/routes/project.rb | 48 +++++++++++++++++++++ views/partials/navbar.erb | 3 +- views/project/add.erb | 53 ++++++++++++++++++++++++ views/project/index.erb | 40 ++++++++++++++++++ views/project/view.erb | 39 +++++++++++++++++ 12 files changed, 259 insertions(+), 4 deletions(-) create mode 100644 db/migrations/0004_add_projects_table.rb create mode 100644 src/models/project.rb create mode 100644 src/routes/project.rb create mode 100644 views/project/add.erb create mode 100644 views/project/index.erb create mode 100644 views/project/view.erb diff --git a/db/migrations/0004_add_projects_table.rb b/db/migrations/0004_add_projects_table.rb new file mode 100644 index 0000000..582ec76 --- /dev/null +++ b/db/migrations/0004_add_projects_table.rb @@ -0,0 +1,35 @@ +Sequel.migration do + + up do + # create projects table + create_table(:projects) do + primary_key :id + String :name, null: false + String :description + DateTime :created_at, default: Sequel::CURRENT_TIMESTAMP + DateTime :updated_at, default: Sequel::CURRENT_TIMESTAMP + end + + # create tables for project many-to-many relationships + create_table(:projects_hardware) do + foreign_key(:project_id, :projects, null: false) + foreign_key(:hardware_id, :hardware, null: false) + end + create_table(:projects_benchmarks) do + foreign_key(:project_id, :projects, null: false) + foreign_key(:benchmark_id, :benchmarks, null: false) + end + create_table(:projects_tests) do + foreign_key(:project_id, :projects, null: false) + foreign_key(:test_id, :tests, null: false) + end + end + + down do + drop_table(:projects_tests) + drop_table(:projects_benchmarks) + drop_table(:projects_hardware) + drop_table(:projects) + end + +end diff --git a/src/models/benchmark.rb b/src/models/benchmark.rb index 5943e19..86f6720 100644 --- a/src/models/benchmark.rb +++ b/src/models/benchmark.rb @@ -2,4 +2,10 @@ class Benchmark < Sequel::Model one_to_many :tests + # many-to-many with Project + many_to_many :projects, + left_id: :project_id, + right_id: :benchmark_id, + join_table: :projects_benchmarks + end diff --git a/src/models/hardware.rb b/src/models/hardware.rb index ed2ac8a..257e394 100644 --- a/src/models/hardware.rb +++ b/src/models/hardware.rb @@ -2,4 +2,10 @@ class Hardware < Sequel::Model(:hardware) one_to_many :tests + # many-to-many with Project + many_to_many :projects, + left_id: :project_id, + right_id: :hardware_id, + join_table: :projects_hardware + end diff --git a/src/models/init.rb b/src/models/init.rb index 3a9103b..a021d24 100644 --- a/src/models/init.rb +++ b/src/models/init.rb @@ -1,4 +1,5 @@ -require_relative 'hardware' require_relative 'benchmark' +require_relative 'hardware' +require_relative 'project' require_relative 'result' require_relative 'test' diff --git a/src/models/project.rb b/src/models/project.rb new file mode 100644 index 0000000..150aa90 --- /dev/null +++ b/src/models/project.rb @@ -0,0 +1,21 @@ +class Project < Sequel::Model(:projects) + + # many-to-many with Hardware + many_to_many :hardware, + left_id: :project_id, + right_id: :hardware_id, + join_table: :projects_hardware + + # many-to-many with Benchmark + many_to_many :benchmarks, + left_id: :project_id, + right_id: :benchmark_id, + join_table: :projects_benchmarks + + # many-to-many with Test + many_to_many :tests, + left_id: :project_id, + right_id: :test_id, + join_table: :projects_tests + +end diff --git a/src/models/test.rb b/src/models/test.rb index 0d1576e..75118c5 100644 --- a/src/models/test.rb +++ b/src/models/test.rb @@ -4,6 +4,12 @@ class Test < Sequel::Model many_to_one :benchmark # link Test model back to its benchmark many_to_one :hardware # link Test model back to hardware used in test + # many-to-many with Project + many_to_many :projects, + left_id: :project_id, + right_id: :test_id, + join_table: :projects_tests + # formats the name of the test for display in the web UI def formatted_name() return "#{self.date_tag} - #{self.hardware.name} / #{self.benchmark.name}" diff --git a/src/routes/init.rb b/src/routes/init.rb index 1c178d2..9c18e1d 100644 --- a/src/routes/init.rb +++ b/src/routes/init.rb @@ -1,5 +1,6 @@ require_relative 'index' -require_relative 'hardware' require_relative 'benchmark' +require_relative 'hardware' +require_relative 'project' require_relative 'result' require_relative 'test' diff --git a/src/routes/project.rb b/src/routes/project.rb new file mode 100644 index 0000000..9679543 --- /dev/null +++ b/src/routes/project.rb @@ -0,0 +1,48 @@ +class GameData < Sinatra::Base + get '/project' do + projects = Project.reverse(:updated_at).limit(10).all() + + erb :'project/index', locals: { + title: 'List of Projects', + projects: projects + } + end + + get '/project/add' do + hardware = Hardware.all() + benchmarks = Benchmark.all() + + erb :'project/add', locals: { + title: 'Add Project', + hardware: hardware, + benchmarks: benchmarks, + } + end + post '/project/add' do + project = Project.create( + name: params[:project_name], + description: params[:project_description] + ) + + params[:project_hardware].each do |h| + hardware = Hardware.where(:id => h).first() + project.add_hardware(hardware) + end + + params[:project_benchmarks].each do |b| + benchmark = Benchmark.where(:id => b).first() + project.add_benchmark(benchmark) + end + + redirect '/project' + end + + get '/project/:project_id' do + project = Project.where(:id => params[:project_id]).first() + + erb :'project/view', locals: { + title: project.name, + project: project, + } + end +end diff --git a/views/partials/navbar.erb b/views/partials/navbar.erb index d71f762..58a7e23 100644 --- a/views/partials/navbar.erb +++ b/views/partials/navbar.erb @@ -2,11 +2,10 @@
diff --git a/views/project/add.erb b/views/project/add.erb new file mode 100644 index 0000000..56cbbb5 --- /dev/null +++ b/views/project/add.erb @@ -0,0 +1,53 @@ +
+
+

Add new project

+
+
+ +
+ +
+
+
+ +
+ +
+ +
+
+ +
+
+ +
+ +
+ +
+
+ + +
+ +
diff --git a/views/project/index.erb b/views/project/index.erb new file mode 100644 index 0000000..4bd6c1f --- /dev/null +++ b/views/project/index.erb @@ -0,0 +1,40 @@ +
+
+

List of projects

+
+ +
+

+ Add new project +

+
+
+ +
+ <% if projects.length > 0 %> +
+ + + + + + + + + + <% projects.each do |p| %> + + + + + + <% end %> + +
Project nameDate addedDate modified
<%= p.name %><%= date_format(p.created_at) %><%= date_format(p.updated_at) %>
+
+ <% else %> +
+

I'm sorry, there doesn't appear to be any projects added yet. Check again later!

+
+ <% end %> +
diff --git a/views/project/view.erb b/views/project/view.erb new file mode 100644 index 0000000..a1479e6 --- /dev/null +++ b/views/project/view.erb @@ -0,0 +1,39 @@ +
+
+

<%= project.name %>

+
+ +
+

+ Edit project +

+
+
+ +
+ +
+

Hardware:

+
    + <% project.hardware.each do |h| %> +
  • <%= h.name %>
  • + <% end %> +
+
+ +
+

Benchmarks:

+
    + <% project.benchmarks.each do |b| %> +
  • <%= b.name %>
  • + <% end %> +
+
+ +
+ +
+

Project description:

+ +

<%= project.description %>

+