mirror of
https://github.com/LaCasemate/fab-manager.git
synced 2025-01-17 06:52:27 +01:00
Merge branch 'projects-openfablab' of git.sleede.com:projets/fab-manager into projects-openfablab
This commit is contained in:
commit
79b69f21ba
2
Gemfile
2
Gemfile
@ -137,3 +137,5 @@ gem 'chroma'
|
||||
gem 'protected_attributes'
|
||||
|
||||
gem 'message_format'
|
||||
|
||||
gem 'openlab_ruby'
|
||||
|
@ -174,6 +174,9 @@ GEM
|
||||
http-cookie (1.0.2)
|
||||
domain_name (~> 0.5)
|
||||
http_parser.rb (0.6.0)
|
||||
httparty (0.13.7)
|
||||
json (~> 1.8)
|
||||
multi_xml (>= 0.5.2)
|
||||
i18n (0.7.0)
|
||||
ice_nine (0.11.1)
|
||||
jbuilder (2.2.12)
|
||||
@ -242,6 +245,8 @@ GEM
|
||||
omniauth-oauth2 (1.3.1)
|
||||
oauth2 (~> 1.0)
|
||||
omniauth (~> 1.2)
|
||||
openlab_ruby (0.0.3)
|
||||
httparty (~> 0.13)
|
||||
orm_adapter (0.5.0)
|
||||
pdf-core (0.5.1)
|
||||
pg (0.18.1)
|
||||
@ -458,6 +463,7 @@ DEPENDENCIES
|
||||
oj
|
||||
omniauth
|
||||
omniauth-oauth2
|
||||
openlab_ruby
|
||||
pg
|
||||
prawn
|
||||
prawn-table
|
||||
|
@ -144,16 +144,16 @@ class ProjectsController
|
||||
##
|
||||
# Controller used on projects listing page
|
||||
##
|
||||
Application.Controllers.controller "ProjectsController", ["$scope", "$state", 'Project', 'machinesPromise', 'themesPromise', 'componentsPromise'
|
||||
, ($scope, $state, Project, machinesPromise, themesPromise, componentsPromise) ->
|
||||
Application.Controllers.controller "ProjectsController", ["$scope", "$state", 'Project', 'machinesPromise', 'themesPromise', 'componentsPromise', 'paginationService', 'OpenlabProject', '$window', 'growl', '_t', '$location', '$timeout'
|
||||
, ($scope, $state, Project, machinesPromise, themesPromise, componentsPromise, paginationService, OpenlabProject, $window, growl, _t, $location, $timeout) ->
|
||||
|
||||
### PRIVATE STATIC CONSTANTS ###
|
||||
|
||||
# Number of notifications added to the page when the user clicks on 'load next notifications'
|
||||
# Number of projects added to the page when the user clicks on 'load more projects'
|
||||
PROJECTS_PER_PAGE = 12
|
||||
|
||||
### PUBLIC SCOPE ###
|
||||
$scope.search = { q: "", from: undefined, machine_id: undefined, component_id: undefined, theme_id: undefined }
|
||||
$scope.search = { q: ($location.$$search.q || ""), from: ($location.$$search.from || undefined), machine_id: ($location.$$search.machine_id || undefined), component_id: ($location.$$search.component_id || undefined), theme_id: ($location.$$search.theme_id || undefined) }
|
||||
|
||||
## list of projects to display
|
||||
$scope.projects = []
|
||||
@ -167,37 +167,68 @@ Application.Controllers.controller "ProjectsController", ["$scope", "$state", 'P
|
||||
## list of components / used for filtering
|
||||
$scope.components = componentsPromise
|
||||
|
||||
## By default, the pagination mode is activated to limit the page size
|
||||
$scope.paginateActive = true
|
||||
$scope.openlab = {}
|
||||
$scope.openlab.projectsActive = Fablab.openlabProjectsActive
|
||||
|
||||
## The currently displayed page number
|
||||
$scope.page = 1
|
||||
if $location.$$search.whole_network is 'f'
|
||||
$scope.openlab.searchOverWholeNetwork = false
|
||||
else
|
||||
$scope.openlab.searchOverWholeNetwork = $scope.openlab.projectsActive || false
|
||||
|
||||
$scope.resetFilters = ->
|
||||
normalizeProjectsAttrs = (projects)->
|
||||
projects.map((project)->
|
||||
project.project_image = project.image_url
|
||||
return project
|
||||
)
|
||||
|
||||
$scope.searchOverWholeNetworkChanged = ->
|
||||
setTimeout ->
|
||||
$scope.resetFiltersAndTriggerSearch()
|
||||
, 150
|
||||
|
||||
loadMoreCallback = (projectsPromise)->
|
||||
$scope.projects = $scope.projects.concat(projectsPromise.projects)
|
||||
updateUrlParam('page', $scope.projectsPagination.currentPage)
|
||||
|
||||
loadMoreOpenlabCallback = (projectsPromise)->
|
||||
$scope.projects = $scope.projects.concat(normalizeProjectsAttrs(projectsPromise.projects))
|
||||
updateUrlParam('page', $scope.projectsPagination.currentPage)
|
||||
|
||||
$scope.loadMore = ->
|
||||
if $scope.openlab.searchOverWholeNetwork is true
|
||||
$scope.projectsPagination.loadMore(q: $scope.search.q)
|
||||
else
|
||||
$scope.projectsPagination.loadMore(search: $scope.search)
|
||||
|
||||
|
||||
$scope.resetFiltersAndTriggerSearch = ->
|
||||
$scope.search.q = ""
|
||||
$scope.search.from = undefined
|
||||
$scope.search.machine_id = undefined
|
||||
$scope.search.component_id = undefined
|
||||
$scope.search.theme_id = undefined
|
||||
$scope.setUrlQueryParams($scope.search)
|
||||
$scope.triggerSearch()
|
||||
|
||||
$scope.triggerSearch = ->
|
||||
Project.search { search: $scope.search, page: 1 }, (projects)->
|
||||
$scope.projects = projects
|
||||
if projects.length < PROJECTS_PER_PAGE
|
||||
$scope.paginateActive = false
|
||||
else
|
||||
$scope.paginateActive = true
|
||||
$scope.page = 2
|
||||
currentPage = parseInt($location.$$search.page) || 1
|
||||
if $scope.openlab.searchOverWholeNetwork is true
|
||||
$scope.projectsPagination = new paginationService.Instance(OpenlabProject, currentPage, PROJECTS_PER_PAGE, null, { }, loadMoreOpenlabCallback)
|
||||
OpenlabProject.query { q: $scope.search.q, page: currentPage, per_page: PROJECTS_PER_PAGE }, (projectsPromise)->
|
||||
if projectsPromise.errors?
|
||||
growl.error(_t('openlab_search_not_available_at_the_moment'))
|
||||
$scope.openlab.searchOverWholeNetwork = false
|
||||
$scope.triggerSearch()
|
||||
else
|
||||
$scope.projectsPagination.totalCount = projectsPromise.meta.total
|
||||
$scope.projects = normalizeProjectsAttrs(projectsPromise.projects)
|
||||
|
||||
$scope.loadMoreProjects = ->
|
||||
# Project.query {page: $scope.page}, (projects) ->
|
||||
# $scope.projects = $scope.projects.concat projects
|
||||
# $scope.paginateActive = false if projects.length < PROJECTS_PER_PAGE
|
||||
Project.search { search: $scope.search, page: $scope.page }, (projects)->
|
||||
$scope.projects = $scope.projects.concat projects
|
||||
$scope.paginateActive = false if projects.length < PROJECTS_PER_PAGE
|
||||
$scope.page += 1
|
||||
else
|
||||
updateUrlParam('whole_network', 'f')
|
||||
$scope.projectsPagination = new paginationService.Instance(Project, currentPage, PROJECTS_PER_PAGE, null, { }, loadMoreCallback, 'search')
|
||||
Project.search { search: $scope.search, page: currentPage, per_page: PROJECTS_PER_PAGE }, (projectsPromise)->
|
||||
$scope.projectsPagination.totalCount = projectsPromise.meta.total
|
||||
$scope.projects = projectsPromise.projects
|
||||
|
||||
|
||||
##
|
||||
@ -205,9 +236,32 @@ Application.Controllers.controller "ProjectsController", ["$scope", "$state", 'P
|
||||
# @param project {{slug:string}} The project to display
|
||||
##
|
||||
$scope.showProject = (project) ->
|
||||
$state.go('app.public.projects_show', {id: project.slug})
|
||||
if ($scope.openlab.searchOverWholeNetwork is true) and (project.app_id isnt Fablab.openlabAppId)
|
||||
$window.open(project.project_url, '_blank')
|
||||
return true
|
||||
else
|
||||
$state.go('app.public.projects_show', {id: project.slug})
|
||||
|
||||
##
|
||||
# function to set all url query search parameters from search object
|
||||
##
|
||||
$scope.setUrlQueryParams = (search)->
|
||||
updateUrlParam('page', 1)
|
||||
updateUrlParam('q', search.q)
|
||||
updateUrlParam('from', search.from)
|
||||
updateUrlParam('theme_id', search.theme_id)
|
||||
updateUrlParam('component_id', search.component_id)
|
||||
updateUrlParam('machine_id', search.machine_id)
|
||||
|
||||
##
|
||||
# function to update url query param, little hack to turn off reloadOnSearch and re-enable it after setting the params
|
||||
# params example: 'q' , 'presse-purée'
|
||||
##
|
||||
updateUrlParam = (name, value) ->
|
||||
$state.current.reloadOnSearch = false
|
||||
$location.search(name, value)
|
||||
$timeout ->
|
||||
$state.current.reloadOnSearch = undefined
|
||||
|
||||
## initialization
|
||||
$scope.triggerSearch()
|
||||
|
@ -219,7 +219,7 @@ angular.module('application.router', ['ui.router']).
|
||||
|
||||
# projects
|
||||
.state 'app.public.projects_list',
|
||||
url: '/projects'
|
||||
url: '/projects?q&page&theme_id&component_id&machine_id&from&whole_network'
|
||||
views:
|
||||
'main@':
|
||||
templateUrl: '<%= asset_path "projects/index.html" %>'
|
||||
|
9
app/assets/javascripts/services/openlab_project.coffee
Normal file
9
app/assets/javascripts/services/openlab_project.coffee
Normal file
@ -0,0 +1,9 @@
|
||||
'use strict'
|
||||
|
||||
Application.Services.factory 'OpenlabProject', ["$resource", ($resource)->
|
||||
$resource "/api/openlab_projects/:id",
|
||||
{id: "@id"},
|
||||
query:
|
||||
method: 'GET'
|
||||
isArray: false
|
||||
]
|
50
app/assets/javascripts/services/pagination_service.coffee
Normal file
50
app/assets/javascripts/services/pagination_service.coffee
Normal file
@ -0,0 +1,50 @@
|
||||
'use strict'
|
||||
|
||||
Application.Services.factory("paginationService", [->
|
||||
helpers = {}
|
||||
|
||||
helpers.pageCount = (totalCount, perPage)->
|
||||
Math.ceil(totalCount/perPage)
|
||||
|
||||
helpers.hasNextPage = (currentPage, totalCount, perPage)->
|
||||
_pageCount = helpers.pageCount(totalCount, perPage)
|
||||
(_pageCount != currentPage) and (_pageCount != 0)
|
||||
|
||||
Instance = (resourceService, currentPage, perPage, totalCount, defaultQueryParams, callback, functionName)->
|
||||
@resourceService = resourceService
|
||||
@currentPage = currentPage
|
||||
@perPage = perPage
|
||||
@totalCount = totalCount
|
||||
@defaultQueryParams = defaultQueryParams
|
||||
@callback = callback
|
||||
@functionName = functionName || 'query'
|
||||
@loading = false
|
||||
|
||||
@pageCount = ->
|
||||
helpers.pageCount(@totalCount, @perPage)
|
||||
|
||||
@hasNextPage = ->
|
||||
helpers.hasNextPage(@currentPage, @totalCount, @perPage)
|
||||
|
||||
@loadMore = (queryParams)->
|
||||
@currentPage += 1
|
||||
@loading = true
|
||||
|
||||
_queryParams = { page: @currentPage, per_page: @perPage }
|
||||
|
||||
if queryParams
|
||||
for k,v of queryParams
|
||||
_queryParams[k] = v
|
||||
|
||||
for k,v of @defaultQueryParams
|
||||
_queryParams[k] = v
|
||||
|
||||
@resourceService[@functionName](_queryParams, (dataPromise)=>
|
||||
@callback(dataPromise)
|
||||
@loading = false
|
||||
)
|
||||
|
||||
return
|
||||
|
||||
return { Instance: Instance }
|
||||
])
|
@ -10,5 +10,5 @@ Application.Services.factory 'Project', ["$resource", ($resource)->
|
||||
search:
|
||||
method: 'GET'
|
||||
url: '/api/projects/search'
|
||||
isArray: true
|
||||
isArray: false
|
||||
]
|
||||
|
@ -23,51 +23,66 @@
|
||||
<section class="m-lg">
|
||||
<div class="row m-b-md">
|
||||
<div class="col-md-12"><h3 class="m-t-xs">{{ 'filter_projects' | translate }}
|
||||
<a href="" class="text-sm pull-right" name="button" ng-click="resetFilters()"><i class="fa fa-refresh"></i> {{ 'reset_all_filters' | translate }}</a></h3>
|
||||
<a href="javascript:void(0);" class="text-sm pull-right" name="button" ng-click="resetFiltersAndTriggerSearch()" ng-show="!openlab.searchOverWholeNetwork"><i class="fa fa-refresh"></i> {{ 'reset_all_filters' | translate }}</a></h3>
|
||||
</div>
|
||||
<div class="col-md-12 m-b">
|
||||
<form class="form-inline">
|
||||
<span ng-if="openlab.projectsActive" uib-tooltip="{{ 'tooltip_openlab_projects_switch' | translate }}" tooltip-trigger="mouseenter">
|
||||
<label for="searchOverWholeNetwork" class="control-label m-r" translate>{{ 'search_over_the_whole_network' }}</label>
|
||||
<input bs-switch
|
||||
ng-model="openlab.searchOverWholeNetwork"
|
||||
type="checkbox"
|
||||
class="form-control"
|
||||
switch-on-text="{{ 'yes' | translate }}"
|
||||
switch-off-text="{{ 'no' | translate }}"
|
||||
switch-animate="true"
|
||||
ng-change="searchOverWholeNetworkChanged()"
|
||||
/>
|
||||
{{ searchOverWholeNetwork }}
|
||||
</span>
|
||||
<form class="form-inline" role="form" ng-submit="setUrlQueryParams(search) && triggerSearch()">
|
||||
<div class="form-group">
|
||||
<div class="input-group">
|
||||
<div class="input-group-addon"><i class="fa fa-search"></i></div>
|
||||
<input type="search" class="form-control" placeholder="Mots-clés" ng-model="search.q"/>
|
||||
<div class="input-group-btn">
|
||||
<button ng-click="triggerSearch()" type="button" class="btn btn-warning" translate>{{ 'search' }}</button>
|
||||
<button type="submit" class="btn btn-warning" translate>{{ 'search' }}</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div class="col-md-3 m-b" ng-show="isAuthenticated()">
|
||||
<select ng-model="search.from" ng-change="triggerSearch()" class="form-control">
|
||||
<option value="" translate>{{ 'all_projects' }}</option>
|
||||
<option value="mine" translate>{{ 'my_projects' }}</option>
|
||||
<option value="collaboration" translate>{{ 'projects_to_whom_i_take_part_in' }}</option>
|
||||
</select>
|
||||
</div>
|
||||
<span ng-if="!openlab.searchOverWholeNetwork">
|
||||
<div class="col-md-3 m-b" ng-show="isAuthenticated()">
|
||||
<select ng-model="search.from" ng-change="setUrlQueryParams(search) && triggerSearch()" class="form-control">
|
||||
<option value="" translate>{{ 'all_projects' }}</option>
|
||||
<option value="mine" translate>{{ 'my_projects' }}</option>
|
||||
<option value="collaboration" translate>{{ 'projects_to_whom_i_take_part_in' }}</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="col-md-3 m-b">
|
||||
<select ng-model="search.machine_id" ng-change="triggerSearch()" class="form-control" ng-options="m.id as m.name for m in machines">
|
||||
<option value="" translate>{{ 'all_machines' }}</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-3 m-b">
|
||||
<select ng-model="search.machine_id" ng-change="setUrlQueryParams(search) && triggerSearch()" class="form-control" ng-options="m.id as m.name for m in machines">
|
||||
<option value="" translate>{{ 'all_machines' }}</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="col-md-3 m-b">
|
||||
<select ng-model="search.theme_id" ng-change="triggerSearch()" class="form-control" ng-options="t.id as t.name for t in themes">
|
||||
<option value="" translate>{{ 'all_themes' }}</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-3 m-b">
|
||||
<select ng-model="search.theme_id" ng-change="setUrlQueryParams(search) && triggerSearch()" class="form-control" ng-options="t.id as t.name for t in themes">
|
||||
<option value="" translate>{{ 'all_themes' }}</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="col-md-3 m-b">
|
||||
<select ng-model="search.component_id" ng-change="triggerSearch()" class="form-control" ng-options="t.id as t.name for t in components">
|
||||
<option value="" translate>{{ 'all_materials' }}</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-3 m-b">
|
||||
<select ng-model="search.component_id" ng-change="setUrlQueryParams(search) && triggerSearch()" class="form-control" ng-options="t.id as t.name for t in components">
|
||||
<option value="" translate>{{ 'all_materials' }}</option>
|
||||
</select>
|
||||
</div>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="row">
|
||||
<span class="col-md-12" ng-show="projects && (projects.length == 0)"> {{ 'project_search_result_is_empty' | translate }} </span>
|
||||
<div class="col-xs-12 col-sm-6 col-md-4" ng-repeat="project in projects" ng-click="showProject(project)">
|
||||
<div class="box-thumb box-thumb-project" style="background-image: url({{project.project_image}});">
|
||||
|
||||
@ -75,10 +90,11 @@
|
||||
|
||||
<div class="box-content project-caption">
|
||||
<h1>{{project.name}}</h1>
|
||||
<h3>{{ project.app_name }}</h3>
|
||||
</div>
|
||||
<div class="box-footer">
|
||||
<div class="btn-group">
|
||||
<div class="btn btn-default" ui-sref="app.logged.projects_edit({id:project.id})" ng-if="projectEditableBy(currentUser) || isAuthorized('admin')">
|
||||
<div class="btn btn-default" ui-sref="app.logged.projects_edit({id:project.id})" ng-if="isAuthorized('admin') && !openlab.searchOverWholeNetwork">
|
||||
<i class="fa fa-edit"></i> {{ 'edit' | translate }}
|
||||
</div>
|
||||
<div class="btn btn-default" ng-click="showProject(project)">
|
||||
@ -92,7 +108,7 @@
|
||||
|
||||
<div class="row">
|
||||
<div class="col-lg-12 text-center">
|
||||
<a class="btn btn-warning" ng-click="loadMoreProjects()" ng-if="paginateActive" translate>{{ 'load_next_projects' }}</a>
|
||||
<a class="btn btn-warning" ng-click="loadMore()" ng-if="projectsPagination.hasNextPage()" translate>{{ 'load_next_projects' }}</a>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
11
app/controllers/api/openlab_projects_controller.rb
Normal file
11
app/controllers/api/openlab_projects_controller.rb
Normal file
@ -0,0 +1,11 @@
|
||||
class API::OpenlabProjectsController < API::ApiController
|
||||
PROJECTS = Openlab::Projects.new
|
||||
|
||||
def index
|
||||
begin
|
||||
render json: PROJECTS.search(params[:q], page: params[:page], per_page: params[:per_page]).response.body
|
||||
rescue StandardError
|
||||
render json: { errors: ['service unavailable'] }
|
||||
end
|
||||
end
|
||||
end
|
@ -51,7 +51,9 @@ class API::ProjectsController < API::ApiController
|
||||
|
||||
def search
|
||||
query_params = JSON.parse(params[:search])
|
||||
@projects = Project.search(query_params, current_user).page(params[:page]).records
|
||||
records = Project.search(query_params, current_user).page(params[:page]).records
|
||||
@total = records.total
|
||||
@projects = records.includes(:users, :project_image)
|
||||
render :index
|
||||
end
|
||||
|
||||
|
@ -1,6 +1,7 @@
|
||||
class Project < ActiveRecord::Base
|
||||
include AASM
|
||||
include NotifyWith::NotificationAttachedObject
|
||||
include OpenlabSync
|
||||
|
||||
# elastic initialisations
|
||||
include Elasticsearch::Model
|
||||
@ -32,6 +33,9 @@ class Project < ActiveRecord::Base
|
||||
has_many :project_steps, dependent: :destroy
|
||||
accepts_nested_attributes_for :project_steps, allow_destroy: true
|
||||
|
||||
# validations
|
||||
validates :author, :name, presence: true
|
||||
|
||||
after_save :after_save_and_publish
|
||||
|
||||
aasm :column => 'state' do
|
||||
@ -104,7 +108,7 @@ class Project < ActiveRecord::Base
|
||||
}
|
||||
}
|
||||
|
||||
if params['q'].empty? # we sort by created_at if there isn't a query
|
||||
if params['q'].blank? # we sort by created_at if there isn't a query
|
||||
search[:sort] = { created_at: { order: :desc } }
|
||||
else # otherwise we search for the word (q) in various fields
|
||||
search[:query][:filtered][:query] = {
|
||||
|
65
app/models/project/openlab_sync.rb
Normal file
65
app/models/project/openlab_sync.rb
Normal file
@ -0,0 +1,65 @@
|
||||
module Project::OpenlabSync
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
included do
|
||||
include ActionView::Helpers::SanitizeHelper
|
||||
|
||||
after_create :openlab_create, if: :openlab_sync_active?
|
||||
after_update :openlab_update, if: :openlab_sync_active?
|
||||
after_destroy :openlab_destroy, if: :openlab_sync_active?
|
||||
|
||||
def openlab_create
|
||||
OpenlabWorker.delay_for(2.seconds).perform_async(:create, self.id) if self.published?
|
||||
end
|
||||
|
||||
def openlab_update
|
||||
if self.published?
|
||||
if self.state_was == 'draft'
|
||||
OpenlabWorker.perform_async(:create, self.id)
|
||||
else
|
||||
OpenlabWorker.perform_async(:update, self.id)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def openlab_destroy
|
||||
OpenlabWorker.perform_async(:destroy, self.id)
|
||||
end
|
||||
|
||||
def openlab_attributes
|
||||
{
|
||||
id: id, slug: slug, name: name, description: description, tags: tags,
|
||||
machines: machines.map(&:name),
|
||||
components: components.map(&:name),
|
||||
themes: themes.map(&:name),
|
||||
author: author&.profile&.full_name,
|
||||
collaborators: users.map { |u| u.profile.full_name },
|
||||
steps_body: steps_body,
|
||||
image_path: project_image&.attachment&.medium&.url,
|
||||
project_path: "/#!/projects/#{slug}",
|
||||
updated_at: updated_at.to_s(:iso8601),
|
||||
created_at: created_at.to_s(:iso8601),
|
||||
published_at: published_at.to_s(:iso8601)
|
||||
}
|
||||
end
|
||||
|
||||
def steps_body
|
||||
concatenated_steps = project_steps.map { |s| "#{s.title} #{s.description}" }
|
||||
.join(' ').gsub('</p>', ' </p>')
|
||||
.gsub("\r\n", ' ').gsub("\n\r", ' ')
|
||||
.gsub("\n", ' ').gsub("\r", ' ').gsub("\t", ' ')
|
||||
|
||||
strip_tags(concatenated_steps).strip
|
||||
end
|
||||
|
||||
def openlab_sync_active?
|
||||
self.class.openlab_sync_active?
|
||||
end
|
||||
end
|
||||
|
||||
class_methods do
|
||||
def openlab_sync_active?
|
||||
Rails.application.secrets.openlab_app_secret.present?
|
||||
end
|
||||
end
|
||||
end
|
@ -1,10 +1,11 @@
|
||||
json.array!(@projects) do |project|
|
||||
json.projects @projects do |project|
|
||||
json.extract! project, :id, :name, :description, :author_id, :licence_id, :slug
|
||||
json.url project_url(project, format: :json)
|
||||
json.project_image project.project_image.attachment.medium.url if project.project_image
|
||||
json.machine_ids project.machine_ids
|
||||
json.author_id project.author_id
|
||||
json.user_ids project.user_ids
|
||||
json.theme_ids project.theme_ids
|
||||
json.component_ids project.component_ids
|
||||
end
|
||||
|
||||
json.meta do
|
||||
json.total @total if @total
|
||||
end
|
||||
|
@ -45,6 +45,12 @@
|
||||
Fablab.weekStartingDay = <%= Date.parse(Rails.application.secrets.week_starting_day).strftime('%w') %>;
|
||||
Fablab.d3DateFormat = "<%= Rails.application.secrets.d3_date_format %>";
|
||||
Fablab.uibDateFormat = "<%= Rails.application.secrets.uib_date_format %>";
|
||||
Fablab.openlabProjectsActive = <%= Rails.application.secrets.openlab_app_secret.present? %>;
|
||||
<% if Rails.application.secrets.openlab_app_id.present? %>
|
||||
Fablab.openlabAppId = "<%= Rails.application.secrets.openlab_app_id %>";
|
||||
<% else %>
|
||||
Fablab.openlabAppId = null;
|
||||
<% end %>
|
||||
</script>
|
||||
|
||||
<%= stylesheet_link_tag 'application', media: 'all' %>
|
||||
|
24
app/workers/openlab_worker.rb
Normal file
24
app/workers/openlab_worker.rb
Normal file
@ -0,0 +1,24 @@
|
||||
class OpenlabWorker
|
||||
include Sidekiq::Worker
|
||||
sidekiq_options queue: 'default', retry: true
|
||||
|
||||
Logger = Sidekiq.logger.level == Logger::DEBUG ? Sidekiq.logger : nil
|
||||
OPENLAB_CLIENT = Openlab::Projects.new
|
||||
|
||||
def perform(action, project_id)
|
||||
logger.debug ["Openlab sync", action, "project ID: #{project_id}"]
|
||||
|
||||
case action.to_s
|
||||
when /create/
|
||||
project = Project.find(project_id)
|
||||
response = OPENLAB_CLIENT.create(project.openlab_attributes)
|
||||
when /update/
|
||||
project = Project.find(project_id)
|
||||
response = OPENLAB_CLIENT.update(project_id, project.openlab_attributes)
|
||||
when /destroy/
|
||||
response = OPENLAB_CLIENT.destroy(project_id)
|
||||
end
|
||||
|
||||
logger.debug ["Openlab sync", "RESPONSE ERROR", response.inspect] unless response.success?
|
||||
end
|
||||
end
|
@ -47,3 +47,7 @@ TIME_ZONE: 'Paris'
|
||||
WEEK_STARTING_DAY: 'monday'
|
||||
D3_DATE_FORMAT: '%d/%m/%y'
|
||||
UIB_DATE_FORMAT: 'dd/MM/yyyy'
|
||||
|
||||
OPENLAB_APP_SECRET:
|
||||
OPENLAB_APP_ID:
|
||||
OPENLAB_BASE_URI: 'https://openlab-projects.com'
|
||||
|
4
config/initializers/openlab_ruby.rb
Normal file
4
config/initializers/openlab_ruby.rb
Normal file
@ -0,0 +1,4 @@
|
||||
Openlab.configure do |config|
|
||||
config.app_secret = Rails.application.secrets.openlab_app_secret
|
||||
config.base_uri = Rails.application.secrets.openlab_base_uri
|
||||
end
|
@ -118,6 +118,10 @@ en:
|
||||
projects_list:
|
||||
# projects gallery
|
||||
the_fablab_projects: "The Fab Lab projects"
|
||||
search_over_the_whole_network: "Search over the whole network"
|
||||
tooltip_openlab_projects_switch: "The search over the whole network lets you search over the projects of every Fab-manager using this feature !"
|
||||
openlab_search_not_available_at_the_moment: "Search over the whole network is not available at the moment. You still can search over the projects of this platform."
|
||||
project_search_result_is_empty: "Sorry, we found no results matching your search criteria."
|
||||
add_a_project: "Add a project"
|
||||
filter_projects: "Filter projects:"
|
||||
reset_all_filters: "Reset all filters"
|
||||
@ -212,4 +216,4 @@ en:
|
||||
you_booked_(DATE): "You booked ({{DATE}}):" # angular interpolation
|
||||
book: "Book"
|
||||
change_the_reservation: "Change the reservation"
|
||||
you_can_shift_this_reservation_on_the_following_slots: "You can shift this reservation on the following slots:"
|
||||
you_can_shift_this_reservation_on_the_following_slots: "You can shift this reservation on the following slots:"
|
||||
|
@ -118,6 +118,10 @@ fr:
|
||||
projects_list:
|
||||
# galerie des projets
|
||||
the_fablab_projects: "Les projets du FabLab"
|
||||
search_over_the_whole_network: "Chercher sur tout le réseau"
|
||||
tooltip_openlab_projects_switch: "La recherche sur tout le réseau vous permet de rechercher parmis les projets de tous les Fab-managers utilisant cette fonctionnalité !"
|
||||
openlab_search_not_available_at_the_moment: "La recherche sur tout le réseau n'est pas disponible pour le moment. Vous ne pouvez cependant effectuer une recherche parmis les projets de cette plateforme."
|
||||
project_search_result_is_empty: "Il n'y a pas de projets correspondant à vos critères de recherche."
|
||||
add_a_project: "Ajouter un projet"
|
||||
filter_projects: "Filtrer les projets :"
|
||||
reset_all_filters: "Réinitialiser tous les filtres"
|
||||
@ -212,4 +216,4 @@ fr:
|
||||
you_booked_(DATE): "Vous avez réservé ({{DATE}}) :" # angular interpolation
|
||||
book: "Réserver"
|
||||
change_the_reservation: "Modifier la réservation"
|
||||
you_can_shift_this_reservation_on_the_following_slots: "Vous pouvez déplacer cette réservation sur les créneaux suivants :"
|
||||
you_can_shift_this_reservation_on_the_following_slots: "Vous pouvez déplacer cette réservation sur les créneaux suivants :"
|
||||
|
@ -27,6 +27,7 @@ Rails.application.routes.draw do
|
||||
get :search
|
||||
end
|
||||
end
|
||||
resources :openlab_projects, only: :index
|
||||
resources :machines
|
||||
resources :components
|
||||
resources :themes
|
||||
|
@ -28,6 +28,9 @@ development:
|
||||
messageformat_locale: <%= ENV["MESSAGEFORMAT_LOCALE"] %>
|
||||
fullcalendar_locale: <%= ENV["FULLCALENDAR_LOCALE"] %>
|
||||
elasticsearch_language_analyzer: <%= ENV["ELASTICSEARCH_LANGUAGE_ANALYZER"] %>
|
||||
openlab_app_secret: <%= ENV["OPENLAB_APP_SECRET"] %>
|
||||
openlab_app_id: <%= ENV["OPENLAB_APP_ID"] %>
|
||||
openlab_base_uri: <%= ENV["OPENLAB_BASE_URI"] %>
|
||||
|
||||
test:
|
||||
secret_key_base: 83daf5e7b80d990f037407bab78dff9904aaf3c195a50f84fa8695a22287e707dfbd9524b403b1dcf116ae1d8c06844c3d7ed942564e5b46be6ae3ead93a9d30
|
||||
@ -47,7 +50,9 @@ test:
|
||||
messageformat_locale: en
|
||||
fullcalendar_locale: en
|
||||
elasticsearch_language_analyzer: french
|
||||
|
||||
openlab_app_secret:
|
||||
openlab_app_id:
|
||||
openlab_base_uri:
|
||||
|
||||
staging:
|
||||
secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
|
||||
@ -74,6 +79,9 @@ staging:
|
||||
messageformat_locale: <%= ENV["MESSAGEFORMAT_LOCALE"] %>
|
||||
fullcalendar_locale: <%= ENV["FULLCALENDAR_LOCALE"] %>
|
||||
elasticsearch_language_analyzer: <%= ENV["ELASTICSEARCH_LANGUAGE_ANALYZER"] %>
|
||||
openlab_app_secret: <%= ENV["OPENLAB_APP_SECRET"] %>
|
||||
openlab_app_id: <%= ENV["OPENLAB_APP_ID"] %>
|
||||
openlab_base_uri: <%= ENV["OPENLAB_BASE_URI"] %>
|
||||
|
||||
# Do not keep production secrets in the repository,
|
||||
# instead read values from the environment.
|
||||
@ -102,3 +110,6 @@ production:
|
||||
messageformat_locale: <%= ENV["MESSAGEFORMAT_LOCALE"] %>
|
||||
fullcalendar_locale: <%= ENV["FULLCALENDAR_LOCALE"] %>
|
||||
elasticsearch_language_analyzer: <%= ENV["ELASTICSEARCH_LANGUAGE_ANALYZER"] %>
|
||||
openlab_app_secret: <%= ENV["OPENLAB_APP_SECRET"] %>
|
||||
openlab_app_id: <%= ENV["OPENLAB_APP_ID"] %>
|
||||
openlab_base_uri: <%= ENV["OPENLAB_BASE_URI"] %>
|
||||
|
@ -43,4 +43,7 @@ ELASTICSEARCH_LANGUAGE_ANALYZER=french
|
||||
TIME_ZONE=Paris
|
||||
WEEK_STARTING_DAY=monday
|
||||
D3_DATE_FORMAT=%d/%m/%y
|
||||
UIB_DATE_FORMAT=dd/MM/yyyy
|
||||
UIB_DATE_FORMAT=dd/MM/yyyy
|
||||
|
||||
OPENLAB_APP_SECRET: 'fSF9jZEWxjHyqjAzzg34jd92'
|
||||
OPENLAB_APP_ID: 'xLn9CmryyURNNHZiDRYVRXbv'
|
||||
|
@ -76,9 +76,10 @@ namespace :fablab do
|
||||
|
||||
desc "sync all/one project in elastic search index"
|
||||
task :es_build_projects_index, [:id] => :environment do |task, args|
|
||||
unless Project.__elasticsearch__.client.indices.exists? index: 'fablab'
|
||||
Project.__elasticsearch__.client.indices.create index: Project.index_name, body: { settings: Project.settings.to_hash, mappings: Project.mappings.to_hash }
|
||||
if Project.__elasticsearch__.client.indices.exists? index: 'fablab'
|
||||
Project.__elasticsearch__.client.indices.delete index: 'fablab'
|
||||
end
|
||||
Project.__elasticsearch__.client.indices.create index: Project.index_name, body: { settings: Project.settings.to_hash, mappings: Project.mappings.to_hash }
|
||||
if args.id
|
||||
IndexerWorker.perform_async(:index, id)
|
||||
else
|
||||
|
13
lib/tasks/fablab/openlab.rake
Normal file
13
lib/tasks/fablab/openlab.rake
Normal file
@ -0,0 +1,13 @@
|
||||
namespace :fablab do
|
||||
namespace :openlab do
|
||||
task bulk_export: :environment do
|
||||
if Rails.application.secrets.openlab_app_secret.present?
|
||||
Project.find_each do |project|
|
||||
project.openlab_create
|
||||
end
|
||||
else
|
||||
warn "Rails.application.secrets.openlab_app_secret not present. Export can't be done."
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
Loading…
x
Reference in New Issue
Block a user