shnaider_code 1.1.6 → 2.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/shnaider_code/version.rb +2 -2
- data/lib/shnaider_code.rb +1 -1
- data/lib/source/attr_limited_regex_accessor.rb +43 -0
- data/lib/source/controllers/create_student_controller.rb +8 -0
- data/lib/source/controllers/edit_student_controller.rb +10 -0
- data/lib/source/controllers/view_controller.rb +106 -0
- data/lib/source/data_construct_pattern/data_construct_pattarn.rb +25 -0
- data/lib/source/data_list.rb +59 -0
- data/lib/source/data_list_student_short.rb +28 -0
- data/lib/source/data_table.rb +21 -0
- data/lib/source/database/scripts/create_table.sql +10 -0
- data/lib/source/database/scripts/fill_data.sql +14 -0
- data/lib/source/database/students_db.rb +78 -0
- data/lib/source/database/students_list_db.rb +36 -0
- data/lib/source/student/abstract_student.rb +26 -0
- data/lib/source/student/student.rb +120 -0
- data/lib/source/student/student_short.rb +59 -0
- data/lib/source/student_list_format.rb +50 -0
- data/lib/source/students_list.rb +43 -0
- data/lib/source/students_list_adapter.rb +89 -0
- data/lib/source/students_list_format_strategy.rb +59 -0
- data/shnaider_code-2.0.0.gem +0 -0
- data/shnaider_code.gemspec +1 -1
- metadata +21 -25
- data/Gemfile +0 -13
- data/lib/source/controllers/student_input_form/student_input_form_controller_create.rb +0 -59
- data/lib/source/controllers/student_input_form/student_input_form_controller_edit.rb +0 -68
- data/lib/source/controllers/tab_students_controller.rb +0 -82
- data/lib/source/db_config/config.yaml +0 -5
- data/lib/source/db_config/migrations/001_create_table_student.sql +0 -12
- data/lib/source/db_config/mock_data/fill_student.sql +0 -6
- data/lib/source/models/student.rb +0 -103
- data/lib/source/models/student_base.rb +0 -100
- data/lib/source/models/student_short.rb +0 -50
- data/lib/source/repositories/adapters/db_source_adapter.rb +0 -54
- data/lib/source/repositories/adapters/file_source_adapter.rb +0 -37
- data/lib/source/repositories/containers/data_list.rb +0 -74
- data/lib/source/repositories/containers/data_list_student_short.rb +0 -18
- data/lib/source/repositories/containers/data_table.rb +0 -35
- data/lib/source/repositories/data_sources/db_data_source.rb +0 -37
- data/lib/source/repositories/data_sources/file_data_source.rb +0 -75
- data/lib/source/repositories/data_sources/transformers/data_transformer_base.rb +0 -15
- data/lib/source/repositories/data_sources/transformers/data_transformer_json.rb +0 -16
- data/lib/source/repositories/data_sources/transformers/data_transformer_yaml.rb +0 -16
- data/lib/source/repositories/student_repository.rb +0 -32
- data/lib/source/util/logger_holder.rb +0 -24
- data/shnaider_code-1.1.4.gem +0 -0
- data/sig/shnaider_code.rbs +0 -4
@@ -0,0 +1,50 @@
|
|
1
|
+
module McDelta
|
2
|
+
class StudentListFormat
|
3
|
+
attr_private_accessor :students
|
4
|
+
attr_accessor :formater
|
5
|
+
|
6
|
+
def initialize(formater)
|
7
|
+
self.formater = formater
|
8
|
+
end
|
9
|
+
|
10
|
+
def read_from(filename)
|
11
|
+
self.students = formater.read_from(filename)
|
12
|
+
end
|
13
|
+
|
14
|
+
def write_to(filename)
|
15
|
+
formater.write_to(filename, self.students)
|
16
|
+
end
|
17
|
+
|
18
|
+
def get_student(id)
|
19
|
+
self.students.detect { |x|
|
20
|
+
x.id == id .to_s
|
21
|
+
}
|
22
|
+
end
|
23
|
+
|
24
|
+
def add_student(student)
|
25
|
+
self.students << student
|
26
|
+
end
|
27
|
+
|
28
|
+
def delete_student(id)
|
29
|
+
index = students.index(students.detect { |x| x.id == id.to_s })
|
30
|
+
self.students.delete_at(index)
|
31
|
+
end
|
32
|
+
|
33
|
+
def replace_student(id, student)
|
34
|
+
self.students.map! { |x| x.id == id.to_s ? student : x }
|
35
|
+
end
|
36
|
+
|
37
|
+
def get_students_slice(k, count)
|
38
|
+
from = [k * count, self.students.count].min
|
39
|
+
to = [self.students.count, from + count].min
|
40
|
+
end
|
41
|
+
|
42
|
+
def count()
|
43
|
+
self.students.count
|
44
|
+
end
|
45
|
+
|
46
|
+
def sort()
|
47
|
+
self.students.sort_by(&:fio_info)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require "source/attr_limited_regex_accessor.rb"
|
2
|
+
|
3
|
+
module McDelta
|
4
|
+
class StudentsList
|
5
|
+
attr_private_accessor :students_list_adapter
|
6
|
+
|
7
|
+
def initialize(adapter)
|
8
|
+
self.students_list_adapter = adapter
|
9
|
+
end
|
10
|
+
|
11
|
+
def get_student(id)
|
12
|
+
students_list_adapter.get_student(id)
|
13
|
+
end
|
14
|
+
|
15
|
+
def remove_student(id)
|
16
|
+
students_list_adapter.remove_student(id)
|
17
|
+
end
|
18
|
+
|
19
|
+
def replace_student(id, student)
|
20
|
+
students_list_adapter.replace_student(id, student)
|
21
|
+
end
|
22
|
+
|
23
|
+
def get_students(from, to, data)
|
24
|
+
values = students_list_adapter.get_students(from, to)
|
25
|
+
|
26
|
+
if data == nil
|
27
|
+
data = DataList.new(list: values)
|
28
|
+
else
|
29
|
+
data.list = values
|
30
|
+
end
|
31
|
+
|
32
|
+
data.list
|
33
|
+
end
|
34
|
+
|
35
|
+
def add_student(student)
|
36
|
+
students_list_adapter.add_student(student)
|
37
|
+
end
|
38
|
+
|
39
|
+
def count
|
40
|
+
students_list_adapter.count()
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
module McDelta
|
2
|
+
class StudentsListAdapter
|
3
|
+
def get_student(id)
|
4
|
+
end
|
5
|
+
|
6
|
+
def remove_student(id)
|
7
|
+
end
|
8
|
+
|
9
|
+
def replace_student(id, student, data)
|
10
|
+
end
|
11
|
+
|
12
|
+
def get_students(from, to, data)
|
13
|
+
end
|
14
|
+
|
15
|
+
def add_student(student)
|
16
|
+
end
|
17
|
+
|
18
|
+
def count
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
class StudentsListDBAdapter < StudentsListAdapter
|
23
|
+
attr_private_accessor :database_list
|
24
|
+
|
25
|
+
def initialize(database_list)
|
26
|
+
self.database_list = database_list
|
27
|
+
end
|
28
|
+
|
29
|
+
def get_student(id)
|
30
|
+
database_list.get_student(id)
|
31
|
+
end
|
32
|
+
|
33
|
+
def remove_student(id)
|
34
|
+
database_list.remove_student(id)
|
35
|
+
end
|
36
|
+
|
37
|
+
def replace_student(id, student)
|
38
|
+
database_list.replace_student(id, student)
|
39
|
+
end
|
40
|
+
|
41
|
+
def get_students(from, to)
|
42
|
+
database_list.get_students_slice(from, to)
|
43
|
+
end
|
44
|
+
|
45
|
+
def add_student(student)
|
46
|
+
database_list.add_student(student)
|
47
|
+
end
|
48
|
+
|
49
|
+
def count
|
50
|
+
database_list.count()
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
class StudentsListFormatterAdapter < StudentsListAdapter
|
55
|
+
attr_private_accessor :formatter
|
56
|
+
|
57
|
+
def initialize(formatter, filename)
|
58
|
+
self.formatter = formatter
|
59
|
+
formatter.read_from(filename)
|
60
|
+
end
|
61
|
+
|
62
|
+
def get_student(id)
|
63
|
+
formatter.get_student(id)
|
64
|
+
end
|
65
|
+
|
66
|
+
def remove_student(id)
|
67
|
+
formatter.delete_student(id)
|
68
|
+
end
|
69
|
+
|
70
|
+
def replace_student(id, student)
|
71
|
+
formatter.replace_student(id, student)
|
72
|
+
end
|
73
|
+
|
74
|
+
def get_students(from, to)
|
75
|
+
count = to - from
|
76
|
+
k = from / count
|
77
|
+
|
78
|
+
formatter.get_students_slice(k, count)
|
79
|
+
end
|
80
|
+
|
81
|
+
def add_student(student)
|
82
|
+
formatter.add_student(student)
|
83
|
+
end
|
84
|
+
|
85
|
+
def count
|
86
|
+
formatter.count()
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
module McDelta
|
5
|
+
class StudentsListFormatStrategy
|
6
|
+
def read_from(filename)
|
7
|
+
require 'method not implemented'
|
8
|
+
end
|
9
|
+
|
10
|
+
def write_to(filename, students)
|
11
|
+
require 'method not implemented'
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
class TxtStudentsListFormatStrategy < StudentsListFormatStrategy
|
16
|
+
def read_from(filename)
|
17
|
+
File.read(filename)
|
18
|
+
.split("\n")
|
19
|
+
.map { |v| Student.from_string(v) }
|
20
|
+
end
|
21
|
+
|
22
|
+
def write_to(filename, students)
|
23
|
+
File.open(filename, 'w') { |file|
|
24
|
+
file.write(
|
25
|
+
students.map { |student|
|
26
|
+
student.get_info
|
27
|
+
}
|
28
|
+
.join("\n")
|
29
|
+
)
|
30
|
+
}
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
class JsonStudentsListFormatStrategy < StudentsListFormatStrategy
|
35
|
+
def read_from(filename)
|
36
|
+
file = File.read(filename)
|
37
|
+
json = JSON.parse(file)
|
38
|
+
json.map { |x| Student.from_json(x) }
|
39
|
+
end
|
40
|
+
|
41
|
+
def write_to(filename, students)
|
42
|
+
File.open(filename, 'w') do |f|
|
43
|
+
f.write(JSON.generate(students.map { |x| x.as_json }))
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
class YamlStudentsListFormatStrategy < StudentsListFormatStrategy
|
49
|
+
def read_from(filename)
|
50
|
+
YAML.load_file(filename)
|
51
|
+
end
|
52
|
+
|
53
|
+
def write_to(filename, students)
|
54
|
+
File.open(filename, 'w') do |file|
|
55
|
+
file.write(students.to_yaml)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
Binary file
|
data/shnaider_code.gemspec
CHANGED
@@ -2,7 +2,7 @@ require_relative "lib/shnaider_code/version"
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |spec|
|
4
4
|
spec.name = "shnaider_code"
|
5
|
-
spec.version =
|
5
|
+
spec.version = ShnaiderCode::VERSION
|
6
6
|
spec.authors = ["Iya"]
|
7
7
|
spec.email = ["iya@gmail.com"]
|
8
8
|
spec.summary = "Student App"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: shnaider_code
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Iya
|
@@ -31,33 +31,29 @@ executables: []
|
|
31
31
|
extensions: []
|
32
32
|
extra_rdoc_files: []
|
33
33
|
files:
|
34
|
-
- Gemfile
|
35
34
|
- lib/shnaider_code.rb
|
36
35
|
- lib/shnaider_code/version.rb
|
37
|
-
- lib/source/
|
38
|
-
- lib/source/controllers/
|
39
|
-
- lib/source/controllers/
|
40
|
-
- lib/source/
|
41
|
-
- lib/source/
|
42
|
-
- lib/source/
|
43
|
-
- lib/source/
|
44
|
-
- lib/source/
|
45
|
-
- lib/source/
|
46
|
-
- lib/source/
|
47
|
-
- lib/source/
|
48
|
-
- lib/source/
|
49
|
-
- lib/source/
|
50
|
-
- lib/source/
|
51
|
-
- lib/source/
|
52
|
-
- lib/source/
|
53
|
-
- lib/source/
|
54
|
-
- lib/source/
|
55
|
-
- lib/source/
|
56
|
-
-
|
57
|
-
- lib/source/util/logger_holder.rb
|
58
|
-
- shnaider_code-1.1.4.gem
|
36
|
+
- lib/source/attr_limited_regex_accessor.rb
|
37
|
+
- lib/source/controllers/create_student_controller.rb
|
38
|
+
- lib/source/controllers/edit_student_controller.rb
|
39
|
+
- lib/source/controllers/view_controller.rb
|
40
|
+
- lib/source/data_construct_pattern/data_construct_pattarn.rb
|
41
|
+
- lib/source/data_list.rb
|
42
|
+
- lib/source/data_list_student_short.rb
|
43
|
+
- lib/source/data_table.rb
|
44
|
+
- lib/source/database/scripts/create_table.sql
|
45
|
+
- lib/source/database/scripts/fill_data.sql
|
46
|
+
- lib/source/database/students_db.rb
|
47
|
+
- lib/source/database/students_list_db.rb
|
48
|
+
- lib/source/student/abstract_student.rb
|
49
|
+
- lib/source/student/student.rb
|
50
|
+
- lib/source/student/student_short.rb
|
51
|
+
- lib/source/student_list_format.rb
|
52
|
+
- lib/source/students_list.rb
|
53
|
+
- lib/source/students_list_adapter.rb
|
54
|
+
- lib/source/students_list_format_strategy.rb
|
55
|
+
- shnaider_code-2.0.0.gem
|
59
56
|
- shnaider_code.gemspec
|
60
|
-
- sig/shnaider_code.rbs
|
61
57
|
homepage: https://github.com/bushmrz/learning-patterns-with-ruby
|
62
58
|
licenses:
|
63
59
|
- MIT
|
data/Gemfile
DELETED
@@ -1,13 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
source "https://rubygems.org"
|
4
|
-
|
5
|
-
gem "mysql2"
|
6
|
-
gem "glimmer-dsl-libui",'~> 0.7.4'
|
7
|
-
gem 'win32api'
|
8
|
-
gem "minitest"
|
9
|
-
gem 'rubocop', group: 'development'
|
10
|
-
gem 'shnaider_code'
|
11
|
-
gem 'sinatra', '~> 3.0', '>= 3.0.6'
|
12
|
-
gem 'thin', '~> 1.8', '>= 1.8.2'
|
13
|
-
|
@@ -1,59 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
require 'source/util/logger_holder'
|
3
|
-
require 'win32api'
|
4
|
-
|
5
|
-
class StudentInputFormControllerCreate
|
6
|
-
def initialize(parent_controller)
|
7
|
-
@parent_controller = parent_controller
|
8
|
-
LoggerHolder.instance.debug('StudentInputFormControllerCreate: initialized')
|
9
|
-
end
|
10
|
-
|
11
|
-
def set_view(view)
|
12
|
-
@view = view
|
13
|
-
LoggerHolder.instance.debug('StudentInputFormControllerCreate: view set')
|
14
|
-
end
|
15
|
-
|
16
|
-
def refresh
|
17
|
-
@parent_controller.refresh_data(1, 20)
|
18
|
-
end
|
19
|
-
|
20
|
-
def on_view_created
|
21
|
-
begin
|
22
|
-
@student_rep = StudentRepository.new(DBSourceAdapter.new)
|
23
|
-
rescue Mysql2::Error::ConnectionError => e
|
24
|
-
on_db_conn_error(e)
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
def process_fields(fields)
|
29
|
-
begin
|
30
|
-
last_name = fields.delete(:last_name)
|
31
|
-
first_name = fields.delete(:first_name)
|
32
|
-
father_name = fields.delete(:father_name)
|
33
|
-
|
34
|
-
return if last_name.nil? || first_name.nil? || father_name.nil?
|
35
|
-
|
36
|
-
student = Student.new(last_name, first_name, father_name, **fields)
|
37
|
-
|
38
|
-
@student_rep.add_student(student)
|
39
|
-
|
40
|
-
LoggerHolder.instance.debug('StudentInputFormControllerCreate: adding student to DB')
|
41
|
-
|
42
|
-
@view.close
|
43
|
-
rescue ArgumentError => e
|
44
|
-
LoggerHolder.instance.debug("StudentInputFormControllerCreate: wrong fields: #{e.message}")
|
45
|
-
api = Win32API.new('user32', 'MessageBox', ['L', 'P', 'P', 'L'], 'I')
|
46
|
-
api.call(0, e.message, 'Error', 0)
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
private
|
51
|
-
|
52
|
-
def on_db_conn_error(error)
|
53
|
-
LoggerHolder.instance.debug('StudentInputFormControllerCreate: DB connection error:')
|
54
|
-
LoggerHolder.instance.error(error.message)
|
55
|
-
api = Win32API.new('user32', 'MessageBox', ['L', 'P', 'P', 'L'], 'I')
|
56
|
-
api.call(0, "No connection to DB", "Error", 0)
|
57
|
-
@view.close
|
58
|
-
end
|
59
|
-
end
|
@@ -1,68 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'source/util/logger_holder'
|
4
|
-
require 'win32api'
|
5
|
-
|
6
|
-
class StudentInputFormControllerEdit
|
7
|
-
def initialize(parent_controller, existing_student_id)
|
8
|
-
@parent_controller = parent_controller
|
9
|
-
@existing_student_id = existing_student_id
|
10
|
-
LoggerHolder.instance.debug('StudentInputFormControllerEdit: initialized')
|
11
|
-
end
|
12
|
-
|
13
|
-
def set_view(view)
|
14
|
-
@view = view
|
15
|
-
LoggerHolder.instance.debug('StudentInputFormControllerEdit: view set')
|
16
|
-
end
|
17
|
-
|
18
|
-
def refresh
|
19
|
-
@parent_controller.refresh_data(1, 20)
|
20
|
-
end
|
21
|
-
|
22
|
-
def on_view_created
|
23
|
-
begin
|
24
|
-
@student_rep = StudentRepository.new(DBSourceAdapter.new)
|
25
|
-
rescue Mysql2::Error::ConnectionError => e
|
26
|
-
on_db_conn_error(e)
|
27
|
-
end
|
28
|
-
@existing_student = @student_rep.student_by_id(@existing_student_id)
|
29
|
-
#@view.make_readonly(:git, :telegram, :email, :phone)
|
30
|
-
populate_fields(@existing_student)
|
31
|
-
end
|
32
|
-
|
33
|
-
def populate_fields(student)
|
34
|
-
@view.set_value(:last_name, student.last_name)
|
35
|
-
@view.set_value(:first_name, student.first_name)
|
36
|
-
@view.set_value(:father_name, student.father_name)
|
37
|
-
@view.set_value(:git, student.git)
|
38
|
-
@view.set_value(:telegram, student.telegram)
|
39
|
-
@view.set_value(:email, student.email)
|
40
|
-
@view.set_value(:phone, student.phone)
|
41
|
-
end
|
42
|
-
|
43
|
-
def process_fields(fields)
|
44
|
-
begin
|
45
|
-
new_student = Student.from_hash(fields)
|
46
|
-
|
47
|
-
LoggerHolder.instance.debug('StudentInputFormControllerEdit: replacing student in DB')
|
48
|
-
|
49
|
-
@student_rep.replace_student(@existing_student_id, new_student)
|
50
|
-
|
51
|
-
@view.close
|
52
|
-
rescue ArgumentError => e
|
53
|
-
LoggerHolder.instance.debug("StudentInputFormControllerEdit: wrong fields: #{e.message}")
|
54
|
-
api = Win32API.new('user32', 'MessageBox', ['L', 'P', 'P', 'L'], 'I')
|
55
|
-
api.call(0, e.message, 'Error', 0)
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
private
|
60
|
-
|
61
|
-
def on_db_conn_error(error)
|
62
|
-
LoggerHolder.instance.debug('StudentInputFormControllerEdit: DB connection error:')
|
63
|
-
LoggerHolder.instance.error(error.message)
|
64
|
-
api = Win32API.new('user32', 'MessageBox', ['L', 'P', 'P', 'L'], 'I')
|
65
|
-
api.call(0, "No connection to DB", "Error", 0)
|
66
|
-
@view.close
|
67
|
-
end
|
68
|
-
end
|
@@ -1,82 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require './LabStudents/views/main_window'
|
4
|
-
require 'source/repositories/student_repository'
|
5
|
-
require 'source/repositories/adapters/db_source_adapter'
|
6
|
-
require 'source/repositories/containers/data_list_student_short'
|
7
|
-
require './LabStudents/views/student_input_form'
|
8
|
-
require 'source/controllers/student_input_form/student_input_form_controller_create'
|
9
|
-
require 'source/controllers/student_input_form/student_input_form_controller_edit'
|
10
|
-
require 'source/util/logger_holder'
|
11
|
-
require 'win32api'
|
12
|
-
|
13
|
-
class TabStudentsController
|
14
|
-
def initialize(view)
|
15
|
-
LoggerHolder.instance.debug('TabStudentsController: init start')
|
16
|
-
@view = view
|
17
|
-
@data_list = DataListStudentShort.new([])
|
18
|
-
@data_list.add_listener(@view)
|
19
|
-
LoggerHolder.instance.debug('TabStudentsController: init done')
|
20
|
-
end
|
21
|
-
|
22
|
-
def on_view_created
|
23
|
-
begin
|
24
|
-
@student_rep = StudentRepository.new(DBSourceAdapter.new)
|
25
|
-
LoggerHolder.instance.debug('TabStudentsController: created student repository')
|
26
|
-
rescue Mysql2::Error::ConnectionError => e
|
27
|
-
on_db_conn_error(e)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
def show_modal_add
|
32
|
-
LoggerHolder.instance.debug('TabStudentsController: showing modal (add)')
|
33
|
-
controller = StudentInputFormControllerCreate.new(self)
|
34
|
-
view = StudentInputForm.new(controller)
|
35
|
-
controller.set_view(view)
|
36
|
-
view.create.show
|
37
|
-
end
|
38
|
-
|
39
|
-
def show_modal_edit(current_page, per_page, selected_row)
|
40
|
-
LoggerHolder.instance.debug('TabStudentsController: showing modal (edit)')
|
41
|
-
student_num = (current_page - 1) * per_page + selected_row
|
42
|
-
@data_list.select_element(student_num)
|
43
|
-
student_id = @data_list.selected_id
|
44
|
-
controller = StudentInputFormControllerEdit.new(self, student_id)
|
45
|
-
view = StudentInputForm.new(controller)
|
46
|
-
controller.set_view(view)
|
47
|
-
view.create.show
|
48
|
-
end
|
49
|
-
|
50
|
-
def delete_selected(current_page, per_page, selected_row)
|
51
|
-
begin
|
52
|
-
LoggerHolder.instance.debug('TabStudentsController: deleting selected student')
|
53
|
-
student_num = (current_page - 1) * per_page + selected_row
|
54
|
-
@data_list.select_element(student_num)
|
55
|
-
student_id = @data_list.selected_id
|
56
|
-
@student_rep.remove_student(student_id)
|
57
|
-
rescue Mysql2::Error::ConnectionError => e
|
58
|
-
on_db_conn_error(e)
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
def refresh_data(page, per_page)
|
63
|
-
begin
|
64
|
-
LoggerHolder.instance.debug('TabStudentsController: refreshing data...')
|
65
|
-
@data_list = @student_rep.paginated_short_students(page, per_page, @data_list)
|
66
|
-
@view.update_student_count(@student_rep.student_count)
|
67
|
-
rescue Mysql2::Error::ConnectionError => e
|
68
|
-
on_db_conn_error(e)
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
private
|
73
|
-
|
74
|
-
def on_db_conn_error(error)
|
75
|
-
LoggerHolder.instance.error('TabStudentsController: DB connection error:')
|
76
|
-
LoggerHolder.instance.error(error.message)
|
77
|
-
api = Win32API.new('user32', 'MessageBox', ['L', 'P', 'P', 'L'], 'I')
|
78
|
-
api.call(0, "No connection to DB", "Error", 0)
|
79
|
-
# TODO: Возможность переключения на JSON помимо exit
|
80
|
-
exit(false)
|
81
|
-
end
|
82
|
-
end
|
@@ -1,12 +0,0 @@
|
|
1
|
-
create table student (
|
2
|
-
id int auto_increment,
|
3
|
-
last_name varchar(128) not null,
|
4
|
-
first_name varchar(128) not null,
|
5
|
-
father_name varchar(128) not null,
|
6
|
-
phone varchar(20) null,
|
7
|
-
telegram varchar(100) null,
|
8
|
-
email varchar(100) null,
|
9
|
-
git varchar(100) null,
|
10
|
-
constraint student_pk
|
11
|
-
primary key (id)
|
12
|
-
);
|
@@ -1,6 +0,0 @@
|
|
1
|
-
insert into student(last_name, first_name, father_name, phone, telegram, email, git) values
|
2
|
-
("Шнайдер", "Ия", "Ниевна", NULL, NULL, NULL, "bushmrz"),
|
3
|
-
("Худокмырлов", "Дмитрий", "Александрович", "78005553535", NULL, NULL, "kittenqz"),
|
4
|
-
("Шнайдер", "Ий", " Ниевич", NULL, NULL, NULL, "invisible"),
|
5
|
-
("Сайксова", "Риночка", "Рири", NULL, "slowrunner3000", NULL, NULL),
|
6
|
-
("Кузнецов", "Максим", "Александрович", "+7-900-900-90-90", "maxonhol", "maximilian@ya.ru", "maxonspb");
|
@@ -1,103 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'json'
|
4
|
-
require_relative 'student_base'
|
5
|
-
|
6
|
-
class Student < StudentBase
|
7
|
-
# Делаем new предка публичным
|
8
|
-
public_class_method :new
|
9
|
-
|
10
|
-
def self.from_hash(hash)
|
11
|
-
hash = hash.dup
|
12
|
-
raise ArgumentError, 'Fields required: fist_name, last_name, father_name' unless hash.key?(:first_name) && hash.key?(:last_name) && hash.key?(:father_name)
|
13
|
-
|
14
|
-
first_name = hash.delete(:first_name)
|
15
|
-
last_name = hash.delete(:last_name)
|
16
|
-
father_name = hash.delete(:father_name)
|
17
|
-
|
18
|
-
Student.new(last_name, first_name, father_name, **hash)
|
19
|
-
end
|
20
|
-
|
21
|
-
# Конструктор из JSON строки
|
22
|
-
def self.from_json_str(str)
|
23
|
-
params = JSON.parse(str, { symbolize_names: true })
|
24
|
-
from_hash(params)
|
25
|
-
end
|
26
|
-
|
27
|
-
# Делаем публичными геттеры и сеттеры базового класса
|
28
|
-
public :phone, :telegram, :email, 'id=', 'phone=', 'telegram=', 'email=', 'git='
|
29
|
-
|
30
|
-
# Стандартные геттеры для полей
|
31
|
-
attr_reader :last_name, :first_name, :father_name
|
32
|
-
|
33
|
-
# Стандартный конструктор
|
34
|
-
def initialize(last_name, first_name, father_name, **options)
|
35
|
-
self.last_name = last_name
|
36
|
-
self.first_name = first_name
|
37
|
-
self.father_name = father_name
|
38
|
-
super(**options)
|
39
|
-
end
|
40
|
-
|
41
|
-
# Сеттеры с валидацией перед присваиванием
|
42
|
-
def last_name=(new_last_name)
|
43
|
-
raise ArgumentError, "Invalid argument: last_name=#{new_last_name}" unless Student.valid_name?(new_last_name)
|
44
|
-
|
45
|
-
@last_name = new_last_name
|
46
|
-
end
|
47
|
-
|
48
|
-
def first_name=(new_first_name)
|
49
|
-
raise ArgumentError, "Invalid argument: first_name=#{new_first_name}" unless Student.valid_name?(new_first_name)
|
50
|
-
|
51
|
-
@first_name = new_first_name
|
52
|
-
end
|
53
|
-
|
54
|
-
def father_name=(new_father_name)
|
55
|
-
raise ArgumentError, "Invalid argument: father_name=#{new_father_name}" unless Student.valid_name?(new_father_name)
|
56
|
-
|
57
|
-
@father_name = new_father_name
|
58
|
-
end
|
59
|
-
|
60
|
-
# Отдельный сеттер для массовой установки контактов
|
61
|
-
def set_contacts(phone: nil, telegram: nil, email: nil)
|
62
|
-
self.phone = phone if phone
|
63
|
-
self.telegram = telegram if telegram
|
64
|
-
self.email = email if email
|
65
|
-
end
|
66
|
-
|
67
|
-
# Имя пользователя в формате Фамилия И. О.
|
68
|
-
def last_name_and_initials
|
69
|
-
"#{last_name} #{first_name[0]}. #{father_name[0]}."
|
70
|
-
end
|
71
|
-
|
72
|
-
# Краткая информация о пользователе
|
73
|
-
def short_info
|
74
|
-
info = {}
|
75
|
-
info[:last_name_and_initials] = last_name_and_initials
|
76
|
-
info[:contact] = short_contact
|
77
|
-
info[:git] = git
|
78
|
-
JSON.generate(info)
|
79
|
-
end
|
80
|
-
|
81
|
-
# Методы приведения объекта к строке
|
82
|
-
def to_s
|
83
|
-
result = "#{last_name} #{first_name} #{father_name}"
|
84
|
-
%i[id phone telegram email git].each do |attr|
|
85
|
-
attr_val = send(attr)
|
86
|
-
result += ", #{attr}=#{attr_val}" unless attr_val.nil?
|
87
|
-
end
|
88
|
-
result
|
89
|
-
end
|
90
|
-
|
91
|
-
def to_hash
|
92
|
-
attrs = {}
|
93
|
-
%i[last_name first_name father_name id phone telegram email git].each do |attr|
|
94
|
-
attr_val = send(attr)
|
95
|
-
attrs[attr] = attr_val unless attr_val.nil?
|
96
|
-
end
|
97
|
-
attrs
|
98
|
-
end
|
99
|
-
|
100
|
-
def to_json_str
|
101
|
-
JSON.generate(to_hash)
|
102
|
-
end
|
103
|
-
end
|