mumukit-platform 4.2.0 → 5.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.ruby-version +1 -1
- data/.travis.yml +1 -1
- data/README.md +17 -1
- data/lib/mumukit/platform.rb +15 -1
- data/lib/mumukit/platform/course.rb +0 -2
- data/lib/mumukit/platform/organization.rb +0 -4
- data/lib/mumukit/platform/organization_mapping.rb +3 -3
- data/lib/mumukit/platform/user.rb +0 -2
- data/lib/mumukit/platform/version.rb +1 -1
- metadata +3 -9
- data/lib/mumukit/platform/course/helpers.rb +0 -43
- data/lib/mumukit/platform/organization/helpers.rb +0 -112
- data/lib/mumukit/platform/organization/profile.rb +0 -39
- data/lib/mumukit/platform/organization/settings.rb +0 -25
- data/lib/mumukit/platform/organization/theme.rb +0 -4
- data/lib/mumukit/platform/user/helpers.rb +0 -142
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a1e1ce06ac9d7055da2a3f86b3a865630a7788e182e0c021485c9b2b638df543
|
4
|
+
data.tar.gz: d1ab26c3c29648fea155c0aef57315b57e1405efab03b44fadfa2f8e06c0724c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 74adaec00a74e0774e0136b6295462a0f47d26380b915cdef19e04a1a7458de90987a599c25c6843362d21bd1626819e5fcfaed6b23d21e9f0b109d4eae77dac
|
7
|
+
data.tar.gz: d40805aa710719fef5c0a78a306787946f312e8d685ed927501696045e1754a3a6f56c855ec3d8f8e9fe02c1a92fd1bf9b8661a00b373576a22ccd0bba65d7b5
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.3
|
1
|
+
2.6.3
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -23,6 +23,23 @@ Or install it yourself as:
|
|
23
23
|
|
24
24
|
$ gem install mumukit-platform
|
25
25
|
|
26
|
+
## Requeriments
|
27
|
+
|
28
|
+
In order to properly use this gem, you must declare _organization_, _course_ and _user_ classes, and implement some required methods:
|
29
|
+
|
30
|
+
_organization_:
|
31
|
+
* `#name`
|
32
|
+
* `#locale`
|
33
|
+
* `.find_by_name!`
|
34
|
+
|
35
|
+
_user_:
|
36
|
+
* `.for_profile`
|
37
|
+
* `.find_by_uid!`
|
38
|
+
|
39
|
+
_course_:
|
40
|
+
* `.find_by_slug!`
|
41
|
+
|
42
|
+
|
26
43
|
## Contributing
|
27
44
|
|
28
45
|
Bug reports and pull requests are welcome on GitHub at https://github.com/mumuki/mumukit-platform. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
|
@@ -30,4 +47,3 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/mumuki
|
|
30
47
|
## License
|
31
48
|
|
32
49
|
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
33
|
-
|
data/lib/mumukit/platform.rb
CHANGED
@@ -26,6 +26,20 @@ module Mumukit::Platform
|
|
26
26
|
end
|
27
27
|
|
28
28
|
CORE_MODELS.each do |klass|
|
29
|
+
# Configured classes must implement the following methods:
|
30
|
+
#
|
31
|
+
# _organization_:
|
32
|
+
# * `#name`
|
33
|
+
# * `#locale`
|
34
|
+
# * `.find_by_name!`
|
35
|
+
#
|
36
|
+
# _user_:
|
37
|
+
# * `.for_profile`
|
38
|
+
# * `.find_by_uid!`
|
39
|
+
#
|
40
|
+
# _course_:
|
41
|
+
# * `.find_by_slug!`
|
42
|
+
#
|
29
43
|
define_singleton_method("#{klass}_class") do
|
30
44
|
begin
|
31
45
|
config["#{klass}_class"] ||= config["#{klass}_class_name"].constantize
|
@@ -42,8 +56,8 @@ require_relative './platform/domain'
|
|
42
56
|
require_relative './platform/model'
|
43
57
|
require_relative './platform/locale'
|
44
58
|
require_relative './platform/course'
|
45
|
-
require_relative './platform/user'
|
46
59
|
require_relative './platform/organization'
|
60
|
+
require_relative './platform/user'
|
47
61
|
require_relative './platform/organization_mapping'
|
48
62
|
require_relative './platform/application'
|
49
63
|
require_relative './platform/web_framework'
|
@@ -9,10 +9,10 @@ module Mumukit::Platform::OrganizationMapping
|
|
9
9
|
|
10
10
|
def self.parse(name)
|
11
11
|
mapping = name.try { |it| it.strip.downcase }
|
12
|
-
if mapping.blank? || mapping == '
|
13
|
-
Subdomain
|
14
|
-
elsif mapping == 'path'
|
12
|
+
if mapping.blank? || mapping == 'path'
|
15
13
|
Path
|
14
|
+
elsif mapping == 'subdomain'
|
15
|
+
Subdomain
|
16
16
|
else
|
17
17
|
raise "Unrecognized organization mapping #{mapping}"
|
18
18
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mumukit-platform
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 5.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Franco Leonardo Bulgarelli
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-04
|
11
|
+
date: 2019-07-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: mumukit-nuntius
|
@@ -144,20 +144,14 @@ files:
|
|
144
144
|
- lib/mumukit/platform/application.rb
|
145
145
|
- lib/mumukit/platform/bridge.rb
|
146
146
|
- lib/mumukit/platform/course.rb
|
147
|
-
- lib/mumukit/platform/course/helpers.rb
|
148
147
|
- lib/mumukit/platform/domain.rb
|
149
148
|
- lib/mumukit/platform/locale.rb
|
150
149
|
- lib/mumukit/platform/model.rb
|
151
150
|
- lib/mumukit/platform/notifiable.rb
|
152
151
|
- lib/mumukit/platform/organization.rb
|
153
|
-
- lib/mumukit/platform/organization/helpers.rb
|
154
|
-
- lib/mumukit/platform/organization/profile.rb
|
155
|
-
- lib/mumukit/platform/organization/settings.rb
|
156
|
-
- lib/mumukit/platform/organization/theme.rb
|
157
152
|
- lib/mumukit/platform/organization_mapping.rb
|
158
153
|
- lib/mumukit/platform/uri.rb
|
159
154
|
- lib/mumukit/platform/user.rb
|
160
|
-
- lib/mumukit/platform/user/helpers.rb
|
161
155
|
- lib/mumukit/platform/version.rb
|
162
156
|
- lib/mumukit/platform/web_framework.rb
|
163
157
|
- lib/mumukit/platform/with_applications.rb
|
@@ -184,7 +178,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
184
178
|
- !ruby/object:Gem::Version
|
185
179
|
version: '0'
|
186
180
|
requirements: []
|
187
|
-
rubygems_version: 3.0.
|
181
|
+
rubygems_version: 3.0.4
|
188
182
|
signing_key:
|
189
183
|
specification_version: 4
|
190
184
|
summary: Shared Mumuki Platform Components
|
@@ -1,43 +0,0 @@
|
|
1
|
-
module Mumukit::Platform::Course::Helpers
|
2
|
-
include Mumukit::Platform::Notifiable
|
3
|
-
|
4
|
-
## Implementors must declare the following methods:
|
5
|
-
#
|
6
|
-
# * slug
|
7
|
-
# * shifts
|
8
|
-
# * code
|
9
|
-
# * days
|
10
|
-
# * period
|
11
|
-
# * description
|
12
|
-
|
13
|
-
def platform_class_name
|
14
|
-
:Course
|
15
|
-
end
|
16
|
-
|
17
|
-
## API Exposure
|
18
|
-
|
19
|
-
def to_param
|
20
|
-
slug
|
21
|
-
end
|
22
|
-
|
23
|
-
## Resource Hash
|
24
|
-
|
25
|
-
def self.slice_resource_h(resource_h)
|
26
|
-
resource_h.slice(:slug, :shifts, :code, :days, :period, :description)
|
27
|
-
end
|
28
|
-
|
29
|
-
def to_resource_h
|
30
|
-
{
|
31
|
-
slug: slug,
|
32
|
-
shifts: shifts,
|
33
|
-
code: code,
|
34
|
-
days: days,
|
35
|
-
period: period,
|
36
|
-
description: description
|
37
|
-
}.except(*protected_resource_fields).compact
|
38
|
-
end
|
39
|
-
|
40
|
-
def protected_resource_fields
|
41
|
-
[]
|
42
|
-
end
|
43
|
-
end
|
@@ -1,112 +0,0 @@
|
|
1
|
-
module Mumukit::Platform::Organization::Helpers
|
2
|
-
extend ActiveSupport::Concern
|
3
|
-
include Mumukit::Platform::Notifiable
|
4
|
-
|
5
|
-
## Implementors must declare the following methods:
|
6
|
-
#
|
7
|
-
# * name
|
8
|
-
# * book
|
9
|
-
# * profile
|
10
|
-
# * settings
|
11
|
-
# * theme
|
12
|
-
|
13
|
-
included do
|
14
|
-
delegate *Mumukit::Platform::Organization::Theme.accessors, to: :theme
|
15
|
-
delegate *Mumukit::Platform::Organization::Settings.accessors, :private?, :login_settings, to: :settings
|
16
|
-
delegate *Mumukit::Platform::Organization::Profile.accessors, :locale_json, to: :profile
|
17
|
-
end
|
18
|
-
|
19
|
-
def platform_class_name
|
20
|
-
:Organization
|
21
|
-
end
|
22
|
-
|
23
|
-
def slug
|
24
|
-
Mumukit::Auth::Slug.join_s name
|
25
|
-
end
|
26
|
-
|
27
|
-
def central?
|
28
|
-
name == 'central'
|
29
|
-
end
|
30
|
-
|
31
|
-
def test?
|
32
|
-
name == 'test'
|
33
|
-
end
|
34
|
-
|
35
|
-
def base?
|
36
|
-
name == 'base'
|
37
|
-
end
|
38
|
-
|
39
|
-
def switch!
|
40
|
-
Mumukit::Platform::Organization.switch! self
|
41
|
-
end
|
42
|
-
|
43
|
-
def to_s
|
44
|
-
name
|
45
|
-
end
|
46
|
-
|
47
|
-
def url_for(path)
|
48
|
-
Mumukit::Platform.application.organic_url_for(name, path)
|
49
|
-
end
|
50
|
-
|
51
|
-
def url
|
52
|
-
url_for '/'
|
53
|
-
end
|
54
|
-
|
55
|
-
def domain
|
56
|
-
Mumukit::Platform.application.organic_domain(name)
|
57
|
-
end
|
58
|
-
|
59
|
-
## API Exposure
|
60
|
-
|
61
|
-
def to_param
|
62
|
-
name
|
63
|
-
end
|
64
|
-
|
65
|
-
## Name validation
|
66
|
-
|
67
|
-
def self.valid_name?(name)
|
68
|
-
!!(name =~ anchored_valid_name_regex)
|
69
|
-
end
|
70
|
-
|
71
|
-
def self.anchored_valid_name_regex
|
72
|
-
/\A#{valid_name_regex}\z/
|
73
|
-
end
|
74
|
-
|
75
|
-
def self.valid_name_regex
|
76
|
-
/([-a-z0-9_]+(\.[-a-z0-9_]+)*)?/
|
77
|
-
end
|
78
|
-
|
79
|
-
## Resource Hash
|
80
|
-
|
81
|
-
def self.slice_resource_h(resource_h)
|
82
|
-
resource_h.slice(:name, :book, :profile, :settings, :theme)
|
83
|
-
end
|
84
|
-
|
85
|
-
def to_resource_h
|
86
|
-
{
|
87
|
-
name: name,
|
88
|
-
book: book.slug,
|
89
|
-
profile: profile,
|
90
|
-
settings: settings,
|
91
|
-
theme: theme
|
92
|
-
}.except(*protected_resource_fields).compact
|
93
|
-
end
|
94
|
-
|
95
|
-
def protected_resource_fields
|
96
|
-
[]
|
97
|
-
end
|
98
|
-
|
99
|
-
module ClassMethods
|
100
|
-
def current
|
101
|
-
Mumukit::Platform::Organization.current
|
102
|
-
end
|
103
|
-
|
104
|
-
def parse(json)
|
105
|
-
json
|
106
|
-
.slice(:name)
|
107
|
-
.merge(theme: Mumukit::Platform::Organization::Theme.parse(json[:theme]))
|
108
|
-
.merge(settings: Mumukit::Platform::Organization::Settings.parse(json[:settings]))
|
109
|
-
.merge(profile: Mumukit::Platform::Organization::Profile.parse(json[:profile]))
|
110
|
-
end
|
111
|
-
end
|
112
|
-
end
|
@@ -1,39 +0,0 @@
|
|
1
|
-
class Mumukit::Platform::Organization::Profile < Mumukit::Platform::Model
|
2
|
-
LOCALES = Mumukit::Platform::Locale::SPECS
|
3
|
-
|
4
|
-
model_attr_accessor :logo_url,
|
5
|
-
:banner_url,
|
6
|
-
:favicon_url,
|
7
|
-
:breadcrumb_image_url,
|
8
|
-
:open_graph_image_url,
|
9
|
-
:locale,
|
10
|
-
:description,
|
11
|
-
:contact_email,
|
12
|
-
:terms_of_service,
|
13
|
-
:community_link,
|
14
|
-
:errors_explanations
|
15
|
-
|
16
|
-
def locale_json
|
17
|
-
locale_h.to_json
|
18
|
-
end
|
19
|
-
|
20
|
-
def locale_h
|
21
|
-
Mumukit::Platform::Locale::SPECS[locale]
|
22
|
-
end
|
23
|
-
|
24
|
-
def logo_url
|
25
|
-
@logo_url ||= 'https://mumuki.io/logo-alt-large.png' # Best image size: 350x75
|
26
|
-
end
|
27
|
-
|
28
|
-
def banner_url
|
29
|
-
@banner_url || logo_url # Best image size: 350x75
|
30
|
-
end
|
31
|
-
|
32
|
-
def favicon_url
|
33
|
-
@favicon_url ||= '/favicon.ico' # Best image size: 16x16, 32x32 or 48x48
|
34
|
-
end
|
35
|
-
|
36
|
-
def open_graph_image_url
|
37
|
-
@open_graph_image_url ||= Mumukit::Platform.application.url_for("logo-alt.png") # Best image size: 256x256
|
38
|
-
end
|
39
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
class Mumukit::Platform::Organization::Settings < Mumukit::Platform::Model
|
2
|
-
model_attr_accessor :login_methods,
|
3
|
-
:login_provider,
|
4
|
-
:login_provider_settings,
|
5
|
-
:forum_discussions_minimal_role,
|
6
|
-
:raise_hand_enabled?,
|
7
|
-
:feedback_suggestions_enabled?,
|
8
|
-
:public?,
|
9
|
-
:embeddable?,
|
10
|
-
:immersive?,
|
11
|
-
:forum_enabled?,
|
12
|
-
:report_issue_enabled?
|
13
|
-
|
14
|
-
def private?
|
15
|
-
!public?
|
16
|
-
end
|
17
|
-
|
18
|
-
def login_methods
|
19
|
-
@login_methods ||= ['user_pass']
|
20
|
-
end
|
21
|
-
|
22
|
-
def forum_discussions_minimal_role
|
23
|
-
(@forum_discussions_minimal_role || 'student').to_sym
|
24
|
-
end
|
25
|
-
end
|
@@ -1,142 +0,0 @@
|
|
1
|
-
module Mumukit::Platform::User::Helpers
|
2
|
-
include Mumukit::Auth::Roles
|
3
|
-
include Mumukit::Platform::Notifiable
|
4
|
-
|
5
|
-
extend Gem::Deprecate
|
6
|
-
|
7
|
-
## Implementors must declare the following methods:
|
8
|
-
#
|
9
|
-
# * permissions
|
10
|
-
# * uid
|
11
|
-
# * social_id
|
12
|
-
# * image_url
|
13
|
-
# * email
|
14
|
-
# * first_name
|
15
|
-
# * last_name
|
16
|
-
|
17
|
-
## Permissions
|
18
|
-
|
19
|
-
delegate :has_role?,
|
20
|
-
:add_permission!,
|
21
|
-
:remove_permission!,
|
22
|
-
:has_permission?,
|
23
|
-
:has_permission_delegation?,
|
24
|
-
:protect!,
|
25
|
-
:protect_delegation!,
|
26
|
-
:protect_permissions_assignment!,
|
27
|
-
to: :permissions
|
28
|
-
|
29
|
-
def platform_class_name
|
30
|
-
:User
|
31
|
-
end
|
32
|
-
|
33
|
-
def merge_permissions!(new_permissions)
|
34
|
-
self.permissions = permissions.merge(new_permissions)
|
35
|
-
end
|
36
|
-
|
37
|
-
(Mumukit::Auth::Roles::ROLES - [:writer, :editor, :owner] + [:discusser]).each do |role|
|
38
|
-
role_of = "#{role}_of?"
|
39
|
-
role_here = "#{role}_here?"
|
40
|
-
|
41
|
-
# Tells whether this user has #{role} permissions in
|
42
|
-
# the given organization
|
43
|
-
define_method role_of do |organization|
|
44
|
-
has_permission? role, organization.slug
|
45
|
-
end
|
46
|
-
|
47
|
-
# Tells whether this user has #{role} permissions in
|
48
|
-
# the current organization
|
49
|
-
define_method role_here do
|
50
|
-
send role_of, Mumukit::Platform::Organization.current
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
# Tells whether this user has forum discusser permissions in
|
55
|
-
# the given organization
|
56
|
-
def discusser_of?(organization)
|
57
|
-
has_permission? organization.forum_discussions_minimal_role, organization.slug
|
58
|
-
end
|
59
|
-
|
60
|
-
(Mumukit::Auth::Roles::ROLES - [:owner]).each do |role|
|
61
|
-
|
62
|
-
# Assignes the #{role} role to this user
|
63
|
-
# for the given slug
|
64
|
-
define_method "make_#{role}_of!" do |slug|
|
65
|
-
add_permission! role, slug
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
## Profile
|
70
|
-
|
71
|
-
def full_name
|
72
|
-
"#{first_name} #{last_name}"
|
73
|
-
end
|
74
|
-
|
75
|
-
alias_method :name, :full_name
|
76
|
-
|
77
|
-
def profile_completed?
|
78
|
-
[first_name, last_name].all? &:present?
|
79
|
-
end
|
80
|
-
|
81
|
-
def to_s
|
82
|
-
"#{full_name} <#{email}> [#{uid}]"
|
83
|
-
end
|
84
|
-
|
85
|
-
## Accesible organizations
|
86
|
-
|
87
|
-
def student_granted_organizations
|
88
|
-
permissions.student_granted_organizations.map do |org|
|
89
|
-
Mumukit::Platform::Organization.find_by_name!(org) rescue nil
|
90
|
-
end.compact
|
91
|
-
end
|
92
|
-
|
93
|
-
def has_student_granted_organizations?
|
94
|
-
student_granted_organizations.present?
|
95
|
-
end
|
96
|
-
|
97
|
-
[[:accessible_organizations, :student_granted_organizations],
|
98
|
-
[:has_accessible_organizations?, :has_student_granted_organizations?]].each do |it, replacement|
|
99
|
-
alias_method it, replacement
|
100
|
-
deprecate it, replacement, 2019, 6
|
101
|
-
end
|
102
|
-
|
103
|
-
def main_organization
|
104
|
-
student_granted_organizations.first
|
105
|
-
end
|
106
|
-
|
107
|
-
def has_main_organization?
|
108
|
-
student_granted_organizations.length == 1
|
109
|
-
end
|
110
|
-
|
111
|
-
def has_immersive_main_organization?
|
112
|
-
!!main_organization.try(&:immersive?)
|
113
|
-
end
|
114
|
-
|
115
|
-
## API Exposure
|
116
|
-
|
117
|
-
def to_param
|
118
|
-
uid
|
119
|
-
end
|
120
|
-
|
121
|
-
## Resource Hash
|
122
|
-
|
123
|
-
def self.slice_resource_h(resource_h)
|
124
|
-
resource_h.slice(:uid, :social_id, :image_url, :email, :first_name, :last_name, :permissions)
|
125
|
-
end
|
126
|
-
|
127
|
-
def to_resource_h
|
128
|
-
{
|
129
|
-
uid: uid,
|
130
|
-
social_id: social_id,
|
131
|
-
image_url: image_url,
|
132
|
-
email: email,
|
133
|
-
first_name: first_name,
|
134
|
-
last_name: last_name,
|
135
|
-
permissions: permissions
|
136
|
-
}.except(*protected_resource_fields).compact
|
137
|
-
end
|
138
|
-
|
139
|
-
def protected_resource_fields
|
140
|
-
[]
|
141
|
-
end
|
142
|
-
end
|