Commit f77c83ab00c7ac8f9cfa37bbffc372147b81c0a7

Authored by Thiago Ribeiro
2 parents dce5c218 ca88bc8c

Fix css/html in institution modal

Showing 88 changed files with 1470 additions and 382 deletions   Show diff stats
Makefile 0 → 100644
@@ -0,0 +1,2 @@ @@ -0,0 +1,2 @@
  1 +%:
  2 + $(MAKE) -C src/ $@
README.chef.md 0 → 100644
@@ -0,0 +1,96 @@ @@ -0,0 +1,96 @@
  1 +# Software Público - configuration management
  2 +
  3 +## Requirements
  4 +
  5 +* [chake](https://rubygems.org/gems/chake)
  6 +* rake
  7 +
  8 +For development
  9 +
  10 +* vagrant
  11 +* shunit2
  12 +* moreutils
  13 +* redir
  14 +
  15 +## Configuration parameters
  16 +
  17 +All configuration parameters are defined in `nodes.yaml`, with exception of IP
  18 +addresses, which are defined in different files:
  19 +
  20 +- for local development, the IP addresses of the Vagrant VMs are defined in
  21 + config/local/ips.yaml.
  22 +
  23 +- for production, you need to create a new file called
  24 + `config/production/ips.yaml`
  25 +
  26 +You will probably not need to change nodes.yaml unless you are developing the
  27 +deployment process.
  28 +
  29 +## Deploy
  30 +
  31 +### Development
  32 +
  33 +First you have to bring up the development virtual machines:
  34 +
  35 +```bash
  36 +$ vagrant up
  37 +$ rake preconfig
  38 +$ rake bootstrap_common
  39 +```
  40 +
  41 +Right now there are 5 VM's, so this might take a while. The basic commands for
  42 +deployment:
  43 +
  44 +```bash
  45 +$ rake # deploys all servers
  46 +$ rake nodes # lists all servers
  47 +$ rake converge:$server # deploys only $server
  48 +```
  49 +
  50 +### Production
  51 +
  52 +* TODO: document adding the SSL key and certificate
  53 +* TODO: document creation of `prod.yaml`.
  54 +* TODO: document SSH configuration
  55 +
  56 +The very first step is
  57 +
  58 +```
  59 +$ rake preconfig SPB_ENV=production
  60 +```
  61 +
  62 +This will perform some initial configuration to the system that is required
  63 +before doing the actual deployment.
  64 +
  65 +After that:
  66 +
  67 +```bash
  68 +$ rake SPB_ENV=production # deploys all servers
  69 +$ rake nodes SPB_ENV=production # lists all servers
  70 +$ rake converge:$server SPB_ENV=production # deploys only $server
  71 +```
  72 +
  73 +You can also do `export SPB_ENV=production` in your shell and omit it in the
  74 +`rake` calls.
  75 +
  76 +See the output of `rake -T` for other tasks.
  77 +
  78 +## Viewing the running site when developping locally
  79 +
  80 +Run:
  81 +
  82 +```bash
  83 +./server
  84 +```
  85 +
  86 +Follow the on-screen instructions an browse to
  87 +[http://softwarepublico.dev/](http://softwarepublico.dev/).
  88 +
  89 +Note: this requires that your system will resolve `\*.dev` to `localhost`.
  90 +Google DNS servers will do that automatically, otherwise you might add the following entries to `/etc/hosts`:
  91 +
  92 +```
  93 +127.0.53.53 softwarepublico.dev
  94 +127.0.53.53 listas.softwarepublico.dev
  95 +```
  96 +
1 -# Software Público - configuration management 1 +# Software Público Brasileiro - desenvolvimento
2 2
3 -## Requirements 3 +## Organização
4 4
5 -* [chake](https://rubygems.org/gems/chake)  
6 -* rake 5 +Este repositório contém tanto o código fonte desenvolvimento especificamente
  6 +para o SPB, quando o código de gestão de configuração necessário para implantar
  7 +o ambiente do SPB.
7 8
8 -For development 9 +O código fonte dos componentes e pacotes desenvolvidos está no diretório
  10 +`src/`. Os demais diretórios contém código de gestão de configuração,
  11 +documentação, utilitários etc.
9 12
10 -* vagrant  
11 -* shunit2  
12 -* moreutils  
13 -* redir 13 +## Fazendo um release
14 14
15 -## Configuration parameters 15 +* Atualize o número de versão no arquivo VERSION
  16 +* Execute `make release`.
16 17
17 -All configuration parameters are defined in `nodes.yaml`, with exception of IP  
18 -addresses, which are defined in different files:  
19 -  
20 -- for local development, the IP addresses of the Vagrant VMs are defined in  
21 - config/local/ips.yaml.  
22 -  
23 -- for production, you need to create a new file called  
24 - `config/production/ips.yaml`  
25 -  
26 -You will probably not need to change nodes.yaml unless you are developing the  
27 -deployment process.  
28 -  
29 -## Deploy  
30 -  
31 -### Development  
32 -  
33 -First you have to bring up the development virtual machines:  
34 -  
35 -```bash  
36 -$ vagrant up  
37 -$ rake preconfig  
38 -$ rake bootstrap_common  
39 -```  
40 -  
41 -Right now there are 5 VM's, so this might take a while. The basic commands for  
42 -deployment:  
43 -  
44 -```bash  
45 -$ rake # deploys all servers  
46 -$ rake nodes # lists all servers  
47 -$ rake converge:$server # deploys only $server  
48 -```  
49 -  
50 -### Production  
51 -  
52 -* TODO: document adding the SSL key and certificate  
53 -* TODO: document creation of `prod.yaml`.  
54 -* TODO: document SSH configuration  
55 -  
56 -The very first step is  
57 -  
58 -```  
59 -$ rake preconfig SPB_ENV=production  
60 -```  
61 -  
62 -This will perform some initial configuration to the system that is required  
63 -before doing the actual deployment.  
64 -  
65 -After that:  
66 -  
67 -```bash  
68 -$ rake SPB_ENV=production # deploys all servers  
69 -$ rake nodes SPB_ENV=production # lists all servers  
70 -$ rake converge:$server SPB_ENV=production # deploys only $server  
71 -```  
72 -  
73 -You can also do `export SPB_ENV=production` in your shell and omit it in the  
74 -`rake` calls.  
75 -  
76 -See the output of `rake -T` for other tasks.  
77 -  
78 -## Viewing the running site when developping locally  
79 -  
80 -Run:  
81 -  
82 -```bash  
83 -./server  
84 -```  
85 -  
86 -Follow the on-screen instructions an browse to  
87 -[http://softwarepublico.dev/](http://softwarepublico.dev/).  
88 -  
89 -Note: this requires that your system will resolve `\*.dev` to `localhost`.  
90 -Google DNS servers will do that automatically, otherwise you might add the following entries to `/etc/hosts`:  
91 -  
92 -```  
93 -127.0.53.53 softwarepublico.dev  
94 -127.0.53.53 listas.softwarepublico.dev  
95 -``` 18 +## Implantação
96 19
  20 +Veja as instruções em README.chef.md.
VERSION 0 → 100644
@@ -0,0 +1 @@ @@ -0,0 +1 @@
  1 +5.0a0
cookbooks/colab/recipes/default.rb
@@ -21,6 +21,11 @@ package 'colab-spb-theme' do @@ -21,6 +21,11 @@ package 'colab-spb-theme' do
21 notifies :restart, 'service[colab]' 21 notifies :restart, 'service[colab]'
22 end 22 end
23 23
  24 +package 'colab-spb-theme' do
  25 + action :upgrade
  26 + notifies :restart, 'service[colab]'
  27 +end
  28 +
24 directory '/etc/colab' do 29 directory '/etc/colab' do
25 owner 'root' 30 owner 'root'
26 group 'root' 31 group 'root'
cookbooks/colab/templates/gitlab.py.erb
@@ -9,6 +9,7 @@ verbose_name = 'Gitlab Plugin' @@ -9,6 +9,7 @@ verbose_name = 'Gitlab Plugin'
9 upstream = 'http://<%= node['peers']['integration'] %>:81/gitlab/' 9 upstream = 'http://<%= node['peers']['integration'] %>:81/gitlab/'
10 10
11 private_token = '<%= @get_private_token.call %>' 11 private_token = '<%= @get_private_token.call %>'
  12 +verify_ssl = False
12 13
13 urls = { 14 urls = {
14 'include': 'colab_gitlab.urls', 15 'include': 'colab_gitlab.urls',
cookbooks/colab/templates/noosfero.py.erb
@@ -27,6 +27,8 @@ menu_urls = ( @@ -27,6 +27,8 @@ menu_urls = (
27 kwargs={'path': 'search/people'}, auth=False), 27 kwargs={'path': 'search/people'}, auth=False),
28 url(display=_('Communities'), viewname='noosfero', 28 url(display=_('Communities'), viewname='noosfero',
29 kwargs={'path': 'search/communities'}, auth=False), 29 kwargs={'path': 'search/communities'}, auth=False),
  30 + url(display=_('Institutions'), viewname='noosfero',
  31 + kwargs={'path': 'search/institutions'}, auth=False),
30 url(display=_('Profile'), viewname='noosfero', 32 url(display=_('Profile'), viewname='noosfero',
31 kwargs={'path': 'profile/~/'}, auth=True), 33 kwargs={'path': 'profile/~/'}, auth=True),
32 url(display=_('Control Panel'), viewname='noosfero', 34 url(display=_('Control Panel'), viewname='noosfero',
cookbooks/noosfero/files/noosfero-create-api-user
@@ -5,13 +5,19 @@ email = ARGV[1] @@ -5,13 +5,19 @@ email = ARGV[1]
5 password = SecureRandom.random_number.to_s 5 password = SecureRandom.random_number.to_s
6 6
7 user = User.find_by_login(login) 7 user = User.find_by_login(login)
8 -exit(0) if user  
9 -  
10 -user = User.create!(  
11 - login: login,  
12 - email: email,  
13 - password: password,  
14 - password_confirmation: password  
15 -)  
16 -user.activate  
17 -user.generate_private_token! 8 +if user
  9 + if user.private_token_expired?
  10 + user.generate_private_token!
  11 + else
  12 + exit(0)
  13 + end
  14 +else
  15 + user = User.create!(
  16 + login: login,
  17 + email: email,
  18 + password: password,
  19 + password_confirmation: password
  20 + )
  21 + user.activate
  22 + user.generate_private_token!
  23 +end
cookbooks/reverse_proxy/templates/reverse_proxy.conf.erb
@@ -42,7 +42,7 @@ server { @@ -42,7 +42,7 @@ server {
42 proxy_set_header REMOTE_USER ''; 42 proxy_set_header REMOTE_USER '';
43 } 43 }
44 44
45 - location /doc/ { 45 + location /doc {
46 root /srv; 46 root /srv;
47 } 47 }
48 48
docs/apoio.rst.in
@@ -65,6 +65,42 @@ Caso os ambientes já tenham sido convergidos anteriormente, não será possíve @@ -65,6 +65,42 @@ Caso os ambientes já tenham sido convergidos anteriormente, não será possíve
65 65
66 O output do comando acima é a sua chave pública, ela deverá ser copiada e colada, manualmente, em ``~/.ssh/authorized_keys`` do usuário desejado. Esse procedimento deve ser repetido em todas as máquinas listadas em ``config/@@SPB_ENV@@/ips.yaml``. 66 O output do comando acima é a sua chave pública, ela deverá ser copiada e colada, manualmente, em ``~/.ssh/authorized_keys`` do usuário desejado. Esse procedimento deve ser repetido em todas as máquinas listadas em ``config/@@SPB_ENV@@/ips.yaml``.
67 67
  68 +Git push com HTTPS
  69 +-----------------
  70 +
  71 +Para a utilização do git com protocolo HTTPS é necessário configurar a senha do perfil do seu usuário na ferramenta Gitlab, pois a senha do seu usuário do portal não é configurada no Gitlab já que a autenticação é feita via REMOTE_USER (cabeçalho HTTP). Para configurar a sua senha no Gitlab é necessário que já exista um usuário válido no portal e o mesmo esteja logado, em seguida, siga os passos a seguir:
  72 +
  73 +1- No menu, clique no botão "Desenvolvimento" para que apareça novas opções
  74 +2- Nas opções apresentadas, clique em "Perfil" para ser direcionado para o seu perfil do Gitlab
  75 +3- No seu perfil será apresentado um novo menu abaixo do menu do portal, nesse menu clique na aba "Password"
  76 +4- Na aba "Password", indique que você esqueceu a sua senha clicando no link "Forgot your password?"
  77 +5- Um email será enviado para o seu endereço de email configurado no seu usuário do portal
  78 +6- Abra o email recebido e clique no link "Change my password", que irá redirecionar para uma página de configuração de uma nova senha
  79 +7- Na página de configuração de uma nova senha digite a sua senha e a confirme (sugere-se que use a mesma senha do portal), finalizando a operação de configuração da senha do seu perfil no Gitlab
  80 +
  81 +Com a senha do seu perfil do Gitlab configurada pode-se utlizar normalmente o git com protocolo HTTPS, onde será solcitado o seu usuário e senha durante as operações. Lembrando que o usuário será o seu usuário do portal e a senha será a que foi configurada com o processo descrito anteriormente.
  82 +
  83 +No Portal do Software Público Brasileiro, assim como em outros portais do governo, temos problemas com o certificado digital. Para o git conseguir realizar as operções usando HTTPS é necessário ignorar o certificado, para isso, abra o terminal (com o git instalado) e execute o seguinte comando::
  84 +
  85 + $ cd <caminho-do-diretório-do-projeto>
  86 + $ git config http.sslVerify "false"
  87 +
  88 +
  89 +Integração manual entre repositórios
  90 +---------------------------------
  91 +
  92 +Para empurrar modificações para mais de um repositório, por exemplo os repositórios do Portal do Software Público Brasileiro e Github, é necessário fazer algumas modificações nas configurações no git localmente (lado do cliente). Para isso, vamos configurar um apelido (alias) que aponte para as URLs dos nossos repositórios, e quando o comando ``git push <alias> <branch>`` for executado, as modificações serão empurradas para todos os nossos repositórios previamente configurados. Ou seja, apenas um comando será executado e todos os repositórios serão atualizados.
  93 +
  94 +Para realizar essa configuração é necessário que tenha o git instalado com um bash(terminal) e o repositório do seu projeto clonado localmente. Tendo isso, abra o bash e execute os comandos a seguir::
  95 +
  96 + $ cd <caminho-do-diretório-do-projeto>
  97 + $ git remote set-url --add --push <apelido> <URL-repo1>
  98 + $ git remote set-url --add --push <apelido> <URL-repo2>
  99 + $ git remote set-url --add --push <apelido> <URL-repo3>
  100 +
  101 +Lembrando que o <apelido> de todos deve ser o mesmo, usualmente é usado o apelido "origin". Com isso, ao empurrar as suas modificações todos os repositórios configurados serão atualizados.
  102 +
  103 +
68 Gerenciando listas de email 104 Gerenciando listas de email
69 --------------------------- 105 ---------------------------
70 O Mailman fornece alguns scripts para administração das listas de email, tais programas podem ser encontrados na máquina ``integration`` em ``/usr/lib/mailman/bin``. 106 O Mailman fornece alguns scripts para administração das listas de email, tais programas podem ser encontrados na máquina ``integration`` em ``/usr/lib/mailman/bin``.
src/Makefile 0 → 100644
@@ -0,0 +1,49 @@ @@ -0,0 +1,49 @@
  1 +VERSION = $(shell cat ../VERSION)
  2 +subdirs = colab-spb-plugin colab-spb-theme-plugin noosfero-spb
  3 +
  4 +dist_all = $(patsubst %, %-dist, $(subdirs))
  5 +dist: $(dist_all)
  6 +$(dist_all): %-dist : %
  7 + if [ -f $*/Makefile ]; then make -C $* dist; fi
  8 + if [ -f $*/setup.py ]; then (cd $* && python setup.py sdist); fi
  9 +
  10 +clean_all = $(patsubst %, %-clean, $(subdirs))
  11 +clean: $(clean_all)
  12 + $(MAKE) -C pkg-rpm/ clean
  13 +
  14 +$(clean_all): %-clean : %
  15 + if [ -f $*/Makefile ]; then make -C $* clean; fi
  16 + if [ -f $*/setup.py ]; then rm -rf $*/dist; fi
  17 +
  18 +release:
  19 + @if git tag | grep -q '^v$(VERSION)$$'; then \
  20 + echo "E: version $(VERSION) already tagged. You need a new version number"; \
  21 + false; \
  22 + fi
  23 + echo '$(VERSION)' > colab-spb-plugin/VERSION
  24 + echo '$(VERSION)' > colab-spb-theme-plugin/VERSION
  25 + echo '$(VERSION)' > noosfero-spb/VERSION
  26 + $(MAKE) dist
  27 + cp noosfero-spb/dist/*.tar.* pkg-rpm/noosfero-spb/
  28 + cp colab-spb-theme-plugin/dist/*.tar.* pkg-rpm/colab-spb-theme/
  29 + cp colab-spb-plugin/dist/*.tar.* pkg-rpm/colab-spb-plugin/
  30 + sed -i -e 's/^\(Version:\s*\).*/\1$(VERSION)/' \
  31 + pkg-rpm/colab-spb-theme/colab-spb-theme.spec \
  32 + pkg-rpm/colab-spb-plugin/colab-spb-plugin.spec \
  33 + pkg-rpm/noosfero-spb/noosfero-spb.spec
  34 + git diff
  35 + @printf "Confirm release? [y/N]"; \
  36 + read confirm; \
  37 + if [ "$$confirm" = 'y' -o "$$confirm" = 'Y' ]; then \
  38 + echo "SPB release $(VERSION)" > .commit_template; \
  39 + git commit * --file .commit_template; \
  40 + rm -f .commit_template; \
  41 + else \
  42 + echo 'Aborting at your request!'; \
  43 + git checkout -- colab-spb-theme-plugin/VERSION noosfero-spb/VERSION colab-spb-plugin/VERSION ; \
  44 + git checkout -- pkg-rpm/colab-spb-theme/ pkg-rpm/noosfero-spb/ pkg-rpm/colab-spb-plugin/ ; \
  45 + false; \
  46 + fi
  47 + # TODO add pkg-rpm/colab-spb-plugin to the git checkout all above
  48 + $(MAKE) -C pkg-rpm/ noosfero-spb-upload colab-spb-theme-upload colab-spb-plugin-upload
  49 + git tag $(VERSION) -s -m 'SPB Release $(VERSION)'
src/colab-spb-plugin/.gitignore
@@ -2,3 +2,4 @@ @@ -2,3 +2,4 @@
2 *.pyc 2 *.pyc
3 *.sw[po] 3 *.sw[po]
4 *~ 4 *~
  5 +dist/
src/colab-spb-plugin/MANIFEST.in
1 include README.rst 1 include README.rst
2 include MANIFEST.in 2 include MANIFEST.in
  3 +include VERSION
3 recursive-include src/colab_spb/static * 4 recursive-include src/colab_spb/static *
4 recursive-include src/colab_spb/locale * 5 recursive-include src/colab_spb/locale *
5 recursive-include src/colab_spb/templates * 6 recursive-include src/colab_spb/templates *
src/colab-spb-plugin/VERSION 0 → 100644
@@ -0,0 +1 @@ @@ -0,0 +1 @@
  1 +5.0a0
src/colab-spb-plugin/setup.py
@@ -11,9 +11,11 @@ install_requires = [&#39;colab&#39;, &#39;colab_noosfero&#39;, &#39;colab_gitlab&#39;] @@ -11,9 +11,11 @@ install_requires = [&#39;colab&#39;, &#39;colab_noosfero&#39;, &#39;colab_gitlab&#39;]
11 11
12 tests_require = [ ] 12 tests_require = [ ]
13 13
  14 +version = open('VERSION').read().strip()
  15 +
14 setup( 16 setup(
15 - name='colab-spb',  
16 - version='0.1.0', 17 + name='colab-spb-plugin',
  18 + version=version,
17 author='Macartur Sousa', 19 author='Macartur Sousa',
18 author_email='macartur.sc@gmail.com', 20 author_email='macartur.sc@gmail.com',
19 url='https://portal.softwarepublico.gov.br/gitlab/softwarepublico/colab-spb-plugin/', 21 url='https://portal.softwarepublico.gov.br/gitlab/softwarepublico/colab-spb-plugin/',
src/colab-spb-plugin/src/colab_spb/apps.py
@@ -5,3 +5,4 @@ from django.apps import AppConfig @@ -5,3 +5,4 @@ from django.apps import AppConfig
5 class SpbAppConfig(AppConfig): 5 class SpbAppConfig(AppConfig):
6 name = 'colab_spb' 6 name = 'colab_spb'
7 verbose_name = 'SPB' 7 verbose_name = 'SPB'
  8 + namespace = 'spb'
src/colab-spb-plugin/tests/plugins.d/gitlab.py
@@ -14,7 +14,6 @@ upstream = &#39;localhost&#39; @@ -14,7 +14,6 @@ upstream = &#39;localhost&#39;
14 14
15 urls = { 15 urls = {
16 'include': 'colab_gitlab.urls', 16 'include': 'colab_gitlab.urls',
17 - 'namespace': 'gitlab', # TODO: do not allow to change namespace  
18 'prefix': 'gitlab', 17 'prefix': 'gitlab',
19 } 18 }
20 19
src/colab-spb-plugin/tests/plugins.d/noosfero.py
@@ -14,7 +14,6 @@ upstream = &#39;localhost&#39; @@ -14,7 +14,6 @@ upstream = &#39;localhost&#39;
14 14
15 urls = { 15 urls = {
16 'include': 'colab_noosfero.urls', 16 'include': 'colab_noosfero.urls',
17 - 'namespace': 'noosfero', # TODO: do not allow to change namespace  
18 'prefix': 'social', 17 'prefix': 'social',
19 } 18 }
20 19
src/colab-spb-plugin/tests/plugins.d/spb.py
@@ -6,7 +6,6 @@ verbose_name = &quot;SPB Plugin&quot; @@ -6,7 +6,6 @@ verbose_name = &quot;SPB Plugin&quot;
6 middlewares = ['colab_spb.middleware.ForceLangMiddleware'] 6 middlewares = ['colab_spb.middleware.ForceLangMiddleware']
7 7
8 urls = {"include": "colab_spb.urls", 8 urls = {"include": "colab_spb.urls",
9 - "prefix": '^spb/',  
10 - "namespace": "colab_spb"} 9 + "prefix": '^spb/',}
11 10
12 url = colab_url_factory('colab_spb') 11 url = colab_url_factory('colab_spb')
src/colab-spb-theme-plugin/Makefile
1 PACKAGE = colab-spb-theme 1 PACKAGE = colab-spb-theme
2 -VERSION = 0.2.0 2 +VERSION = $(shell cat VERSION)
3 DISTDIR = dist 3 DISTDIR = dist
4 PACKAGE_NAME = $(PACKAGE)-$(VERSION) 4 PACKAGE_NAME = $(PACKAGE)-$(VERSION)
5 TARBALL = $(PACKAGE_NAME).tar.gz 5 TARBALL = $(PACKAGE_NAME).tar.gz
@@ -10,10 +10,10 @@ all: @@ -10,10 +10,10 @@ all:
10 colab_dir=/usr/lib/colab 10 colab_dir=/usr/lib/colab
11 11
12 dist: clean 12 dist: clean
13 - mkdir -p $(DISTDIR)/$(PACKAGE_NAME)  
14 - tar --exclude=.git --exclude=$(DISTDIR) -cf - * | (cd $(DISTDIR)/$(PACKAGE_NAME) && tar xzf -) 13 + mkdir -p $(DISTDIR)/$(PACKAGE_NAME)
  14 + tar --exclude=.git --exclude=$(DISTDIR) -cf - * | (cd $(DISTDIR)/$(PACKAGE_NAME) && tar xf -)
15 cd $(DISTDIR) && tar -czf $(TARBALL) $(PACKAGE_NAME) 15 cd $(DISTDIR) && tar -czf $(TARBALL) $(PACKAGE_NAME)
16 - rm -r $(DISTDIR)/$(PACKAGE_NAME) 16 + rm -r $(DISTDIR)/$(PACKAGE_NAME)
17 clean: 17 clean:
18 $(RM) $(TARBALL) 18 $(RM) $(TARBALL)
19 $(RM) -r $(DISTDIR) 19 $(RM) -r $(DISTDIR)
src/colab-spb-theme-plugin/VERSION 0 → 100644
@@ -0,0 +1 @@ @@ -0,0 +1 @@
  1 +5.0a0
src/noosfero-spb/.gitignore
1 -*.tar.gz  
2 -/noosfero-spb-* 1 +dist/
src/noosfero-spb/Makefile
1 PACKAGE = noosfero-spb 1 PACKAGE = noosfero-spb
2 -VERSION = 4.2.1 2 +VERSION = $(shell cat VERSION)
3 DISTDIR = $(PACKAGE)-$(VERSION) 3 DISTDIR = $(PACKAGE)-$(VERSION)
4 TARBALL = $(DISTDIR).tar.gz 4 TARBALL = $(DISTDIR).tar.gz
5 5
@@ -11,13 +11,13 @@ themes_dir=/usr/lib/noosfero/public/designs/themes @@ -11,13 +11,13 @@ themes_dir=/usr/lib/noosfero/public/designs/themes
11 noosfero_dir=/usr/lib/noosfero 11 noosfero_dir=/usr/lib/noosfero
12 12
13 dist: clean 13 dist: clean
14 - mkdir $(DISTDIR)  
15 - tar --exclude=.git --exclude=$(DISTDIR) -cf - * | (cd $(DISTDIR) && tar xaf -)  
16 - tar --exclude=.git -czf $(TARBALL) $(DISTDIR) 14 + mkdir -p dist/$(DISTDIR)
  15 + tar --exclude=.git --exclude=$(DISTDIR) -cf - * | (cd dist/$(DISTDIR) && tar xaf -)
  16 + cd dist && tar --exclude=.git -czf $(TARBALL) $(DISTDIR)
  17 + $(RM) -r dist/$(DISTDIR)
17 18
18 clean: 19 clean:
19 - $(RM) $(TARBALL)  
20 - $(RM) -r $(DISTDIR) 20 + $(RM) -r dist/
21 21
22 install: 22 install:
23 install -d -m 0755 $(DESTDIR)/$(plugins_dir)/software_communities 23 install -d -m 0755 $(DESTDIR)/$(plugins_dir)/software_communities
src/noosfero-spb/VERSION 0 → 100644
@@ -0,0 +1 @@ @@ -0,0 +1 @@
  1 +5.0a0
src/noosfero-spb/gov_user/lib/gov_user_plugin.rb
@@ -9,6 +9,10 @@ class GovUserPlugin &lt; Noosfero::Plugin @@ -9,6 +9,10 @@ class GovUserPlugin &lt; Noosfero::Plugin
9 include ActionDispatch::Routing 9 include ActionDispatch::Routing
10 include Rails.application.routes.url_helpers 10 include Rails.application.routes.url_helpers
11 11
  12 + def self.api_mount_points
  13 + [GovUserPlugin::API]
  14 + end
  15 +
12 def self.plugin_name 16 def self.plugin_name
13 "GovUserPlugin" 17 "GovUserPlugin"
14 end 18 end
src/noosfero-spb/gov_user/lib/gov_user_plugin/api.rb 0 → 100644
@@ -0,0 +1,23 @@ @@ -0,0 +1,23 @@
  1 +require File.dirname(__FILE__) + '/../../../../../lib/noosfero/api/helpers'
  2 +require_relative 'api_entities'
  3 +
  4 +class GovUserPlugin::API < Grape::API
  5 +
  6 + include Noosfero::API::APIHelpers
  7 +
  8 + resource :gov_user do
  9 + get 'institutions' do
  10 + authenticate!
  11 + institutions = select_filtered_collection_of(environment,'communities',params).joins(:institution)
  12 + present institutions.map{|o|o.institution}, :with => Entities::Institution
  13 + end
  14 +
  15 + get 'institutions/:id' do
  16 + authenticate!
  17 + institution = Institution.find_by_id(params[:id])
  18 + present institution, :with => Entities::Institution
  19 + end
  20 +
  21 + end
  22 +end
  23 +
src/noosfero-spb/gov_user/lib/gov_user_plugin/api_entities.rb 0 → 100644
@@ -0,0 +1,13 @@ @@ -0,0 +1,13 @@
  1 +module Entities
  2 + class Institution < Noosfero::API::Entity
  3 + root 'institutions', 'institution'
  4 + expose :name, :acronym, :unit_code, :parent_code, :unit_type,
  5 + :sub_juridical_nature, :normalization_level,
  6 + :version, :cnpj, :type, :governmental_power,
  7 + :governmental_sphere, :sisp, :juridical_nature,
  8 + :corporate_name, :siorg_code, :id
  9 + expose :community_id do |institution,options|
  10 + institution.community.id
  11 + end
  12 + end
  13 +end
src/noosfero-spb/gov_user/test/unit/api_test.rb 0 → 100644
@@ -0,0 +1,51 @@ @@ -0,0 +1,51 @@
  1 +require File.dirname(__FILE__) + '/../../../../test/unit/api/test_helper'
  2 +require File.dirname(__FILE__) + '/../helpers/plugin_test_helper'
  3 +
  4 +class GovUserApiTest < ActiveSupport::TestCase
  5 +
  6 + include PluginTestHelper
  7 +
  8 + def setup
  9 + login_api
  10 + environment = Environment.default
  11 + environment.enable_plugin(GovUserPlugin)
  12 + @gov_power = GovernmentalPower.create(:name=>"Some Gov Power")
  13 + @gov_sphere = GovernmentalSphere.create(:name=>"Some Gov Sphere")
  14 + @juridical_nature = JuridicalNature.create(:name => "Autarquia")
  15 + @institution = create_public_institution(
  16 + "Ministerio Publico da Uniao",
  17 + "MPU",
  18 + "BR",
  19 + "DF",
  20 + "Gama",
  21 + @juridical_nature,
  22 + @gov_power,
  23 + @gov_sphere,
  24 + "11.222.333/4444-55")
  25 + end
  26 +
  27 + should 'list all institutions' do
  28 + @institution1 = create_public_institution(
  29 + "Instituicao bacana",
  30 + "IB",
  31 + "BR",
  32 + "DF",
  33 + "Gama",
  34 + @juridical_nature,
  35 + @gov_power,
  36 + @gov_sphere,
  37 + "11.222.333/4444-56"
  38 + )
  39 +
  40 + get "/api/v1/gov_user/institutions?#{params.to_query}"
  41 + json = JSON.parse(last_response.body)
  42 + assert_equivalent [@institution.id, @institution1.id], json['institutions'].map {|c| c['id']}
  43 + end
  44 +
  45 + should 'get institution by id' do
  46 + get "/api/v1/gov_user/institutions/#{@institution.id}?#{params.to_query}"
  47 + json = JSON.parse(last_response.body)
  48 + assert_equal @institution.id, json["institution"]["id"]
  49 + end
  50 +
  51 +end
src/noosfero-spb/noosfero-spb-theme/README.md
@@ -3,4 +3,154 @@ PSB Theme for Noosfero @@ -3,4 +3,154 @@ PSB Theme for Noosfero
3 3
4 Noosfero theme for the _Portal do Software Público_ project. 4 Noosfero theme for the _Portal do Software Público_ project.
5 5
6 -Install on /public/designs/themes/noosfero-spb-theme  
7 \ No newline at end of file 6 \ No newline at end of file
  7 +Install on /public/designs/themes/noosfero-spb-theme
  8 +
  9 +================================
  10 +
  11 +# Passos para configurar o tema a partir do spb/spb
  12 +
  13 +## Considerando que o clone do noosfero está na pasta home
  14 +
  15 +```bash
  16 +rm -r ~/noosfero/public/design/theme/noosfero-spb-theme
  17 +cd ~
  18 +git clone git@softwarepublico.gov.br:softwarepublico/softwarepublico.git
  19 +cd softwarepublico/src/noosfero-spb/
  20 +ln -sr noosfero-spb-theme/ ~/noosfero/public/designs/themes/
  21 +ln -sr software_communities ~/noosfero/plugins/
  22 +ln -sr gov_user ~/noosfero/plugins/
  23 +git remote add theme git@softwarepublico.gov.br:softwarepublico/noosfero-spb-theme.git
  24 +```
  25 +
  26 +# Para instalar o Colab
  27 +
  28 +```bash
  29 +cd ~
  30 +git clone https://github.com/colab/colab
  31 +```
  32 +
  33 +## Configuração
  34 +
  35 +Seguir [tutorial](https://github.com/colab/colab/blob/master/README.rst) do próprio Colab
  36 +
  37 +## Arquivos de configuração Colab
  38 +
  39 +Estando com o ambiente do vagrant levantado `(vagrant up && vagrant ssh)`,
  40 +e "trabalhando" com o colab `(workon colab)`:
  41 +
  42 +## Clone os repositórios:
  43 +
  44 +```bash
  45 +cd ~
  46 +git clone git@softwarepublico.gov.br:softwarepublico/softwarepublico.git
  47 +git clone https://github.com/colab/colab-gitlab-plugin
  48 +git clone https://github.com/colab/colab-noosfero-plugin
  49 +```
  50 +
  51 +## Criando diretórios - Plugins do Colab
  52 +
  53 +```bash
  54 +mkdir /etc/colab/plugins.d/
  55 +cd plugins.d
  56 +```
  57 +
  58 +## Crie os arquivos
  59 +
  60 +### gitlab.py
  61 +
  62 +```bash
  63 +vim gitlab.py
  64 +```
  65 +
  66 +#### Conteúdo do gitlab.py
  67 +
  68 +```python
  69 +from django.utils.translation import ugettext_lazy as _
  70 +from colab.plugins.utils.menu import colab_url_factory
  71 +
  72 +name = "colab_gitlab"
  73 +verbose_name = "Gitlab"
  74 +
  75 +upstream = ''
  76 +private_token = ''
  77 +
  78 +urls = {
  79 + "include":"colab_gitlab.urls",
  80 + "prefix": 'gitlab/',
  81 + "namespace":"gitlab"
  82 + }
  83 +
  84 +url = colab_url_factory('gitlab')
  85 +```
  86 +
  87 +### noosfero.py
  88 +
  89 +```bash
  90 +vim noosfero.py
  91 +```
  92 +
  93 +#### Conteúdo do noosfero.py
  94 +
  95 +```python
  96 +from django.utils.translation import ugettext_lazy as _
  97 +from colab.plugins.utils.menu import colab_url_factory
  98 +
  99 +name = "colab_noosfero"
  100 +verbose_name = "Noosfero"
  101 +private_token = ""
  102 +
  103 +upstream = 'http://<IP DA SUA MÁQUINA AQUI>:8080/social'
  104 +
  105 +urls = {
  106 + "include":"colab_noosfero.urls",
  107 + "prefix": '^social/',
  108 + "namespace":"social"
  109 + }
  110 +
  111 +url = colab_url_factory('social')
  112 +```
  113 +
  114 +### spb.py
  115 +
  116 +```bash
  117 +vim spb.py
  118 +```
  119 +
  120 +#### Conteúdo do spb.py
  121 +
  122 +```python
  123 +from django.utils.translation import ugettext_lazy as _
  124 +from colab.plugins.utils.menu import colab_url_factory
  125 +
  126 +name = "colab_spb"
  127 +verbose_name = "SPB Plugin"
  128 +urls = {
  129 + "include":"colab_spb.urls",
  130 + "prefix": '^spb/',
  131 + "namespace":"colab_spb"
  132 + }
  133 +
  134 +url = colab_url_factory('colab_spb')
  135 +```
  136 +### Execuntando scripts de instalação
  137 +
  138 +```bash
  139 +cd ~/softwarepublico/config/
  140 +pip install -e .
  141 +cd ~/softwarepublico/src/colab-spb-plugin/
  142 +pip install -e .
  143 +colab-admin migrate
  144 +colab-admin migrate colab_spb
  145 +cd ~/colab-gitlab-plugin/
  146 +pip install -e .
  147 +cd ~/softwarepublico/src/colab-spb-plugin/
  148 +pip install -e .
  149 +colab-admin migrate
  150 +```
  151 +
  152 +## Finalizando
  153 +
  154 +Execute o noosfero seja no ambiente local, ou schroot,
  155 +com o comando `RAILS_RELATIVE_URL_ROOT=/social unicorn`
  156 +
  157 +No vagrant, execute `colab-admin runserver 0.0.0.0:8000`
src/noosfero-spb/noosfero-spb-theme/css/community-pages.css
@@ -409,18 +409,19 @@ @@ -409,18 +409,19 @@
409 } 409 }
410 410
411 #content #blog-tab .blog .blog-post h1{ 411 #content #blog-tab .blog .blog-post h1{
412 - margin: 0px 0px 10px 0px; 412 + margin: 0px 0px 4px 0px;
413 padding: 0px 0px 0px 0px; 413 padding: 0px 0px 0px 0px;
414 - max-width: 555px; 414 + max-width: 100%;
415 max-height: 40px; 415 max-height: 40px;
416 border: none; 416 border: none;
417 font: normal normal bold 16px/20px Arial; 417 font: normal normal bold 16px/20px Arial;
418 overflow: hidden; 418 overflow: hidden;
419 - display: inline-block; 419 + display: block;
  420 + text-align: left;
420 } 421 }
421 422
422 #content #blog-tab .blog .blog-post .post-pic{ 423 #content #blog-tab .blog .blog-post .post-pic{
423 - margin:0 20px 5px 0px; 424 + margin:0 20px 25px 0px;
424 border-radius: 4px; 425 border-radius: 4px;
425 height: 62px; 426 height: 62px;
426 width: 19%; 427 width: 19%;
@@ -477,6 +478,7 @@ @@ -477,6 +478,7 @@
477 color: #172738; 478 color: #172738;
478 padding-left:0px; 479 padding-left:0px;
479 text-align: left; 480 text-align: left;
  481 + display: inline-block;
480 } 482 }
481 #content #blog-tab .blog .blog-post.position-1 .date{ 483 #content #blog-tab .blog .blog-post.position-1 .date{
482 padding-left:0px; 484 padding-left:0px;
@@ -492,6 +494,10 @@ float: left; @@ -492,6 +494,10 @@ float: left;
492 } 494 }
493 495
494 /* Read more button*/ 496 /* Read more button*/
  497 +#content #blog-tab .blog .blog-post .read-more{
  498 + display: none;
  499 +}
  500 +
495 #content #blog-tab .blog .read-more{ 501 #content #blog-tab .blog .read-more{
496 text-align: right; 502 text-align: right;
497 display: block; 503 display: block;
@@ -541,6 +547,31 @@ float: left; @@ -541,6 +547,31 @@ float: left;
541 } 547 }
542 548
543 /*Block with Community information - Need to develop solution - Only display on profile page */ 549 /*Block with Community information - Need to develop solution - Only display on profile page */
  550 +#agenda-toolbar a.button{
  551 + opacity: 1.0;
  552 +}
  553 +
  554 +#content .software-events-block{
  555 + display: none;
  556 +}
  557 +
  558 +.action-profile_design-index #content .software-events-block,
  559 +.profile-type-is-community .action-profile-index #content .software-events-block{
  560 + display: block;
  561 +}
  562 +
  563 +/*** Right bar ***/
  564 +
  565 +.template-default.profile-type-is-community .action-profile-index #content .box-3 .software-events-block,
  566 +.template-lefttopright.profile-type-is-community .action-profile-index #content .box-2 .software-events-block{
  567 + display: none;
  568 +}
  569 +
  570 +.template-lefttopright.profile-type-is-community .action-content_viewer-view_page #content .box-2 .software-events-block{
  571 + display: block;
  572 +}
  573 +
  574 +/*Block with Community information - Need to develop solution - Only display on profile page */
544 575
545 .profile-type-is-community .block.community-block{ 576 .profile-type-is-community .block.community-block{
546 display: none; 577 display: none;
@@ -1151,7 +1182,7 @@ float: left; @@ -1151,7 +1182,7 @@ float: left;
1151 overflow: hidden; 1182 overflow: hidden;
1152 } 1183 }
1153 1184
1154 -/*** Events ***/ 1185 +/*** Events internal page ***/
1155 1186
1156 #content .article-body-event .event-card{ 1187 #content .article-body-event .event-card{
1157 border-top: 1px dotted #D3D6D3; 1188 border-top: 1px dotted #D3D6D3;
@@ -1189,7 +1220,7 @@ float: left; @@ -1189,7 +1220,7 @@ float: left;
1189 letter-spacing: 0.48px; 1220 letter-spacing: 0.48px;
1190 } 1221 }
1191 1222
1192 -#content .article-body-event .event-link a{ 1223 +#content .box-1 .article-body-event .event-link a{
1193 text-decoration: underline; 1224 text-decoration: underline;
1194 } 1225 }
1195 1226
@@ -1206,3 +1237,77 @@ float: left; @@ -1206,3 +1237,77 @@ float: left;
1206 font-family: Arial; 1237 font-family: Arial;
1207 line-height: 22px; 1238 line-height: 22px;
1208 } 1239 }
  1240 +
  1241 +/*software-events-block box-1*/
  1242 +
  1243 +.box-1 .software-events-block ul.software-community-events-list {
  1244 + border: 1px solid #D3D6DE;
  1245 + border-radius: 8px;
  1246 + width: 100%;
  1247 +}
  1248 +
  1249 +.box-1 .software-events-block li.software-events-list-item {
  1250 + border-bottom: 1px dotted #D3D6DE;
  1251 + font-size: 14px;
  1252 + padding: 7px 0px;
  1253 + padding-left: 16px;
  1254 +}
  1255 +
  1256 +.box-1 .software-events-block li.software-events-list-item:last-child{
  1257 + border:none;
  1258 +}
  1259 +
  1260 +.box-1 .software-events-block .software-events-list-item-calendar {
  1261 + background-image: url("../images/calendar-icon.png");
  1262 + background-repeat: no-repeat;
  1263 + width: 14px;
  1264 + height: 14px;
  1265 + float: left;
  1266 + margin-top: 2px;
  1267 +}
  1268 +
  1269 +.box-1 .software-events-block .software-events-list-item-date {
  1270 + padding-left: 5px;
  1271 + font-weight: 700;
  1272 +}
  1273 +
  1274 +.box-1 .software-events-block .software-events-list-item-title {
  1275 + padding-left: 1px;
  1276 +}
  1277 +
  1278 +/*software-events-block - sidebar - box2*/
  1279 +
  1280 +#content .box-2 .software-events-block .software-community-events-block{
  1281 + border:1px solid #C0C1C1;
  1282 + border-radius:4px;
  1283 + background-color:#ECEDF1;
  1284 +}
  1285 +
  1286 +#content .box-2 .software-events-block .software-events-list-item{
  1287 + padding:10px 15px;
  1288 + border-bottom:1px dotted #C0C1C1;
  1289 + color:#2C4B6B;
  1290 + font-size: 15px;
  1291 + font-weight: 500;
  1292 +}
  1293 +
  1294 +#content .box-2 .software-events-block .software-events-list-item-date{
  1295 + font-weight: 800;
  1296 +}
  1297 +
  1298 +#content .box-2 .software-events-block .software-events-list-item-title a,
  1299 +#content .box-2 .software-events-block .software-events-list-item-title a:visited{
  1300 + color:#2C4B6B;
  1301 +}
  1302 +
  1303 +#content .box-2 .software-events-block .software-events-list-item:first-child{
  1304 + color:#172738;
  1305 + font-weight: 800;
  1306 + text-transform: uppercase;
  1307 + border-bottom: 1px solid #C0C1C1;
  1308 + padding:10px 15px;
  1309 +}
  1310 +
  1311 +#content .box-2 .software-events-block .software-events-list-item:last-child{
  1312 + border:none;
  1313 +}
src/noosfero-spb/noosfero-spb-theme/css/home-page.css
@@ -283,9 +283,9 @@ @@ -283,9 +283,9 @@
283 .action-home-index #content .display-content-block .image{ 283 .action-home-index #content .display-content-block .image{
284 padding-right: 25px; 284 padding-right: 25px;
285 padding: 0px 25px 0px 0px; 285 padding: 0px 25px 0px 0px;
286 - border: 0px solid #c0c1c1;  
287 - width: 150px; 286 + max-width: 150px;
288 display: table-cell; 287 display: table-cell;
  288 + vertical-align: top;
289 } 289 }
290 290
291 .controller-environment_design #content .display-content-block .image a, 291 .controller-environment_design #content .display-content-block .image a,
@@ -298,7 +298,6 @@ @@ -298,7 +298,6 @@
298 298
299 .controller-environment_design #content .display-content-block .image img, 299 .controller-environment_design #content .display-content-block .image img,
300 .action-home-index #content .display-content-block .image img{ 300 .action-home-index #content .display-content-block .image img{
301 - border: 0px solid #c0c1c1;  
302 max-width: 150px; 301 max-width: 150px;
303 } 302 }
304 303
src/noosfero-spb/noosfero-spb-theme/css/news-page.css
@@ -57,13 +57,14 @@ @@ -57,13 +57,14 @@
57 57
58 #content .blog .blog-post h1.title { 58 #content .blog .blog-post h1.title {
59 margin: 0px 0px 10px 0px; 59 margin: 0px 0px 10px 0px;
60 - padding: 0px 0px 0px 0px;  
61 - max-width: 555px; 60 + padding: 0px;
  61 + max-width: 100%;
62 max-height: 40px; 62 max-height: 40px;
63 border: none; 63 border: none;
64 font: normal normal bold 16px/20px arial; 64 font: normal normal bold 16px/20px arial;
65 overflow: hidden; 65 overflow: hidden;
66 - display: inline-block; 66 + display: block;
  67 + white-space: normal;
67 } 68 }
68 69
69 #content .blog .blog-post h1.title a { 70 #content .blog .blog-post h1.title a {
@@ -148,15 +149,24 @@ @@ -148,15 +149,24 @@
148 149
149 150
150 /** Secondary News' Block **/ 151 /** Secondary News' Block **/
  152 +
  153 +#content .blog .page-1 .position-1 .title,
  154 +#content .blog .page-1 .position-2 .title,
  155 +#content .blog .page-1 .position-3 .title,
  156 +#content .blog .page-1 .position-4 .title {
  157 + display: inline-block;
  158 +}
  159 +
151 #content .blog .page-1 .position-2, 160 #content .blog .page-1 .position-2,
152 #content .blog .page-1 .position-3, 161 #content .blog .page-1 .position-3,
153 #content .blog .page-1 .position-4 { 162 #content .blog .page-1 .position-4 {
154 - margin: 0px 0px 0px 0px;  
155 - padding: 20px 21px 45px 0px;  
156 - height: 235px; 163 + margin: 0px;
  164 + padding: 20px 4.2% 5px 0px;
  165 + height: auto;
157 width: 30.5%; 166 width: 30.5%;
158 display: block; 167 display: block;
159 float: left; 168 float: left;
  169 + border-bottom: none;
160 } 170 }
161 171
162 #content .blog .page-1 .position-2 p, 172 #content .blog .page-1 .position-2 p,
@@ -173,7 +183,7 @@ @@ -173,7 +183,7 @@
173 #content .blog .page-1 .position-2 .post-pic, 183 #content .blog .page-1 .position-2 .post-pic,
174 #content .blog .page-1 .position-3 .post-pic, 184 #content .blog .page-1 .position-3 .post-pic,
175 #content .blog .page-1 .position-4 .post-pic { 185 #content .blog .page-1 .position-4 .post-pic {
176 - margin-top: 12px; 186 + margin-bottom: 12px;
177 top: 10px; 187 top: 10px;
178 height: 120px; 188 height: 120px;
179 width: 100%; 189 width: 100%;
@@ -200,6 +210,10 @@ @@ -200,6 +210,10 @@
200 /* This rule serves to maintain the element in position-5 clear the 210 /* This rule serves to maintain the element in position-5 clear the
201 * configurations of float. 211 * configurations of float.
202 */ 212 */
  213 +#content .blog .page-1 .blog-post.position-5{
  214 + border-top:1px solid #ccc;
  215 +}
  216 +
203 #content .blog .blog-post.position-5 { 217 #content .blog .blog-post.position-5 {
204 clear: both; 218 clear: both;
205 } 219 }
src/noosfero-spb/noosfero-spb-theme/css/notifications.css
@@ -51,13 +51,14 @@ @@ -51,13 +51,14 @@
51 color: #8a6d3b; 51 color: #8a6d3b;
52 } 52 }
53 53
54 -.environment-notification-plugin-notification-bar .warningnotification p a,  
55 -.environment-notification-plugin-notification-notification-modal .warningnotification p a{ 54 +#content .environment-notification-plugin-notification-bar .warningnotification p a,
  55 +#content .environment-notification-plugin-notification-bar .warningnotification p a:visited,
  56 +#content .environment-notification-plugin-notification-notification-modal .warningnotification p a
  57 +#content .environment-notification-plugin-notification-notification-modal .warningnotification p a:visited{
56 font-weight: bold; 58 font-weight: bold;
57 color: #8a6d3b; 59 color: #8a6d3b;
58 } 60 }
59 61
60 -  
61 .environment-notification-plugin-notification-bar .informationnotification, 62 .environment-notification-plugin-notification-bar .informationnotification,
62 .environment-notification-plugin-notification-notification-modal .informationnotification{ 63 .environment-notification-plugin-notification-notification-modal .informationnotification{
63 background: #d9edf7; 64 background: #d9edf7;
src/noosfero-spb/noosfero-spb-theme/css/search-pages.css
@@ -2,7 +2,8 @@ @@ -2,7 +2,8 @@
2 2
3 .action-search-index #content form #search-header, 3 .action-search-index #content form #search-header,
4 .action-search-people #content form #search-header, 4 .action-search-people #content form #search-header,
5 -.action-search-communities #content form #search-header { 5 +.action-search-communities #content form #search-header,
  6 +.action-search-institutions #content form #search-header {
6 float: right; 7 float: right;
7 border: none; 8 border: none;
8 } 9 }
@@ -12,12 +13,14 @@ @@ -12,12 +13,14 @@
12 } 13 }
13 14
14 .action-search-people #content form #search-header, 15 .action-search-people #content form #search-header,
15 -.action-search-communities #content form #search-header {  
16 - margin: 0 0 15px 0 ; 16 +.action-search-communities #content form #search-header,
  17 +.action-search-institutions #content form #search-header {
  18 + margin: 0 0 15px 0;
17 } 19 }
18 20
19 .action-search-people #content form #search-header #search-filters .sod_select, 21 .action-search-people #content form #search-header #search-filters .sod_select,
20 -.action-search-communities #content form #search-header #search-filters .sod_select { 22 +.action-search-communities #content form #search-header #search-filters .sod_select,
  23 +.action-search-institutions #content form #search-header #search-filters .sod_select {
21 color: #3E67B1; 24 color: #3E67B1;
22 border: 1px solid #3E67B1; 25 border: 1px solid #3E67B1;
23 border-radius: 4px; 26 border-radius: 4px;
@@ -28,7 +31,8 @@ @@ -28,7 +31,8 @@
28 } 31 }
29 32
30 .action-search-people #content form #search-header #search-filters .sod_select .sod_list, 33 .action-search-people #content form #search-header #search-filters .sod_select .sod_list,
31 -.action-search-communities #content form #search-header #search-filters .sod_select .sod_list { 34 +.action-search-communities #content form #search-header #search-filters .sod_select .sod_list,
  35 +.action-search-institutions #content form #search-header #search-filters .sod_select .sod_list {
32 margin: -2px 0 0 -1px; 36 margin: -2px 0 0 -1px;
33 color: #3E67B1; 37 color: #3E67B1;
34 border: 1px solid #3E67B1; 38 border: 1px solid #3E67B1;
@@ -40,34 +44,41 @@ @@ -40,34 +44,41 @@
40 } 44 }
41 45
42 .action-search-people #content form #search-header #search-filters .sod_select .sod_list .active, 46 .action-search-people #content form #search-header #search-filters .sod_select .sod_list .active,
43 -.action-search-communities #content form #search-header #search-filters .sod_select .sod_list .active { 47 +.action-search-communities #content form #search-header #search-filters .sod_select .sod_list .active,
  48 +.action-search-institutions #content form #search-header #search-filters .sod_select .sod_list .active {
44 border-radius: 0px 0px 4px 4px; 49 border-radius: 0px 0px 4px 4px;
45 } 50 }
46 51
47 .action-search-people #content form #search-header #search-filters .sod_select .sod_list .selected, 52 .action-search-people #content form #search-header #search-filters .sod_select .sod_list .selected,
48 -.action-search-communities #content form #search-header #search-filters .sod_select .sod_list .selected { 53 +.action-search-communities #content form #search-header #search-filters .sod_select .sod_list .selected,
  54 +.action-search-institutions #content form #search-header #search-filters .sod_select .sod_list .selected {
49 padding-right: 21px; 55 padding-right: 21px;
50 } 56 }
51 57
52 .action-search-people #content form #search-subheader .sod_select, 58 .action-search-people #content form #search-subheader .sod_select,
53 -.action-search-communities #content form #search-subheader .sod_select { 59 +.action-search-communities #content form #search-subheader .sod_select,
  60 +.action-search-institutions #content form #search-subheader .sod_select {
54 line-height: 15px; 61 line-height: 15px;
55 } 62 }
56 63
57 .action-search-index #content form .search-field, 64 .action-search-index #content form .search-field,
58 .action-search-people #content form .search-field, 65 .action-search-people #content form .search-field,
59 -.action-search-communities #content form .search-field{ 66 +.action-search-communities #content form .search-field,
  67 +.action-search-institutions #content form .search-field {
60 margin-bottom: 30px; 68 margin-bottom: 30px;
61 } 69 }
62 70
63 .action-search-index #content form .search-field .formfield, 71 .action-search-index #content form .search-field .formfield,
64 .action-search-people #content form .search-field .formfield, 72 .action-search-people #content form .search-field .formfield,
65 -.action-search-communities #content form .search-field .formfield{ 73 +.action-search-communities #content form .search-field .formfield,
  74 +.action-search-institutions #content form .search-field .formfield {
66 width: 99%; 75 width: 99%;
67 } 76 }
  77 +
68 .action-search-index #content form .search-field .formfield input, 78 .action-search-index #content form .search-field .formfield input,
69 .action-search-people #content form .search-field .formfield input, 79 .action-search-people #content form .search-field .formfield input,
70 -.action-search-communities #content form .search-field .formfield input { 80 +.action-search-communities #content form .search-field .formfield input,
  81 +.action-search-institutions #content form .search-field .formfield input {
71 margin-top: 0px; 82 margin-top: 0px;
72 padding: 6px; 83 padding: 6px;
73 height: 19px; 84 height: 19px;
@@ -81,7 +92,8 @@ @@ -81,7 +92,8 @@
81 92
82 .action-search-index #content form input.button.submit, 93 .action-search-index #content form input.button.submit,
83 .action-search-people #content form input.button.submit, 94 .action-search-people #content form input.button.submit,
84 -.action-search-communities #content form input.button.submit { 95 +.action-search-communities #content form input.button.submit,
  96 +.action-search-institutions #content form input.button.submit {
85 background: #3E67B1; 97 background: #3E67B1;
86 color: #FFF; 98 color: #FFF;
87 border-radius: 4px; 99 border-radius: 4px;
@@ -94,12 +106,14 @@ @@ -94,12 +106,14 @@
94 106
95 .action-search-index #content form input.button.submit:hover, 107 .action-search-index #content form input.button.submit:hover,
96 .action-search-people #content form input.button.submit:hover, 108 .action-search-people #content form input.button.submit:hover,
97 -.action-search-communities #content form input.button.submit:hover { 109 +.action-search-communities #content form input.button.submit:hover,
  110 +.action-search-institutions #content form input.button.submit:hover {
98 background: #5E82C6; 111 background: #5E82C6;
99 } 112 }
100 113
101 .action-search-people #search-results .search-results-type-people, 114 .action-search-people #search-results .search-results-type-people,
102 -.action-search-communities #search-results .search-results-type-community { 115 +.action-search-communities #search-results .search-results-type-community,
  116 +.action-search-institutions #search-results .search-results-type-institution {
103 background: none; 117 background: none;
104 border: 1px solid #ccc; 118 border: 1px solid #ccc;
105 border-radius: 10px; 119 border-radius: 10px;
@@ -119,3 +133,31 @@ @@ -119,3 +133,31 @@
119 background: none; 133 background: none;
120 border: 1px solid #ccc; 134 border: 1px solid #ccc;
121 } 135 }
  136 +
  137 +.search-software-item .search-software-content-block .search-content-result a {
  138 + color: #172738 !important;
  139 +}
  140 +
  141 +.action-search-institutions .common-profile-list-block .vcard a.profile_link, .comment-actions .vcard a.profile_link{
  142 + height: 108px;
  143 + max-height: 108px;
  144 +}
  145 +
  146 +.action-search-institutions #content .search-results-box .vcard{
  147 + margin: 8.5px
  148 +}
  149 +
  150 +.action-search-institutions .menu-submenu-content{
  151 + height: auto;
  152 +}
  153 +
  154 +.action-search-institutions #content .menu-submenu h4{
  155 + text-align: center;
  156 +}
  157 +
  158 +.action-search-institutions #content .menu-submenu-content ul a{
  159 + padding-left: 0;
  160 + text-align: center;
  161 +}
  162 +
  163 +
src/noosfero-spb/noosfero-spb-theme/css/software-catalog-page.css
@@ -53,7 +53,7 @@ @@ -53,7 +53,7 @@
53 margin: 0 0 0 15px; 53 margin: 0 0 0 15px;
54 } 54 }
55 55
56 - It's TEMPORARY 56 + It's TEMPORARY
57 .action-search-software_infos #content .search-form .doubts-catalog-software { 57 .action-search-software_infos #content .search-form .doubts-catalog-software {
58 display: none; 58 display: none;
59 }*/ 59 }*/
@@ -65,7 +65,7 @@ @@ -65,7 +65,7 @@
65 line-height: 20px; 65 line-height: 20px;
66 position:absolute; 66 position:absolute;
67 } 67 }
68 -.action-search-software_infos .search-form label, 68 +.action-search-software_infos .search-form label,
69 .action-search-software_infos .search-form label{ 69 .action-search-software_infos .search-form label{
70 margin:0px 3px 4px 32px; 70 margin:0px 3px 4px 32px;
71 line-height: 22px; 71 line-height: 22px;
@@ -310,9 +310,9 @@ @@ -310,9 +310,9 @@
310 310
311 /* Column left */ 311 /* Column left */
312 312
313 -.action-search-software_infos #search-results .search-software-item-column-left{  
314 - width: 130px;  
315 - height: 130px; 313 +.action-search-software_infos #search-results .search-software-item-column-left {
  314 + width: 140px;
  315 + height: 140px;
316 float: left; 316 float: left;
317 border-right: 1px dotted #ccc; 317 border-right: 1px dotted #ccc;
318 } 318 }
@@ -359,7 +359,7 @@ @@ -359,7 +359,7 @@
359 } 359 }
360 360
361 .action-search-software_infos #search-results .search-software-item-column-left .extra_info { 361 .action-search-software_infos #search-results .search-software-item-column-left .extra_info {
362 - width: 130px; 362 + width: 140px;
363 padding-right: 20px; 363 padding-right: 20px;
364 top: 0px; 364 top: 0px;
365 position: absolute; 365 position: absolute;
@@ -370,18 +370,32 @@ @@ -370,18 +370,32 @@
370 opacity: inherit; 370 opacity: inherit;
371 } 371 }
372 372
373 -.action-search-software_infos #search-results .search-software-item-column-left .extra_info::before{ 373 +.action-search-software_infos #search-results .search-software-item-column-left .software-date {
  374 + margin-top: 20px;
  375 + width: 130px;
  376 +}
  377 +
  378 +.action-search-software_infos #search-results .search-software-item-column-left .software-date::before{
374 content: url("../images/ic-calendar.png"); 379 content: url("../images/ic-calendar.png");
375 - margin: 6px 10px 20px 0; 380 + margin: 0px 7px 20px 0;
376 float: left; 381 float: left;
377 } 382 }
378 383
  384 +.action-search-software_infos #search-results .search-software-item-column-left .star-container.catalog_rating_block {
  385 + width: 140px;
  386 + margin-left: 0px;
  387 +}
  388 +
  389 +.action-search-software_infos #search-results .search-software-item-column-left .software-date-value {
  390 + margin-left: 23px;
  391 +}
  392 +
379 /* Column Right */ 393 /* Column Right */
380 394
381 .action-search-software_infos #search-results .search-software-item-column-right { 395 .action-search-software_infos #search-results .search-software-item-column-right {
382 - width: 70%; 396 + width: 65%;
383 float: left; 397 float: left;
384 - margin-left: 130px; 398 + margin-left: 140px;
385 padding: 0 0 0 8px; 399 padding: 0 0 0 8px;
386 font-size: 15px; 400 font-size: 15px;
387 font-family: Arial; 401 font-family: Arial;
@@ -439,3 +453,5 @@ @@ -439,3 +453,5 @@
439 font-size: 13px; 453 font-size: 13px;
440 text-decoration: underline; 454 text-decoration: underline;
441 } 455 }
  456 +
  457 +
src/noosfero-spb/noosfero-spb-theme/css/software-pages.css
@@ -89,14 +89,15 @@ @@ -89,14 +89,15 @@
89 display: block; 89 display: block;
90 } 90 }
91 91
92 -#content .download-block .download-button #download-size {  
93 - border: 1px solid #1a397d;  
94 - border-radius: 0px 0px 8px 8px;  
95 - background-color: #1a397d;  
96 - color: #ffffff;  
97 - font-size: 12px; 92 +#content .download-block .download-button .download-size {
98 text-align: center; 93 text-align: center;
99 - display: none; 94 + display: block;
  95 + background: rgb(0, 40, 140) none repeat scroll 0% 0%;
  96 + color: rgb(255, 255, 255);
  97 + border-bottom-left-radius: 5px;
  98 + border-bottom-right-radius: 5px;
  99 + margin-top: -15px;
  100 + line-height: 20px;
100 } 101 }
101 102
102 #content .download-block .download-info { 103 #content .download-block .download-info {
@@ -208,9 +209,7 @@ @@ -208,9 +209,7 @@
208 } 209 }
209 210
210 #content .box-1 .categories-and-tags-block .category_cloud{ 211 #content .box-1 .categories-and-tags-block .category_cloud{
211 - display: inline-flex;  
212 margin: 13px 0 10px 0; 212 margin: 13px 0 10px 0;
213 - max-width: 87%;  
214 } 213 }
215 214
216 #content .box-1 .categories-and-tags-block .category_cloud a{ 215 #content .box-1 .categories-and-tags-block .category_cloud a{
@@ -590,7 +589,7 @@ @@ -590,7 +589,7 @@
590 padding: 45px 40px 4px 10px; 589 padding: 45px 40px 4px 10px;
591 border: 1px solid #2C66CE; 590 border: 1px solid #2C66CE;
592 border-radius: 4px; 591 border-radius: 4px;
593 - background: #2C66CE url("../images/download-mini_icon.png") center center no-repeat; 592 + background: #2C66CE url("../images/history-mini_icon.png") center center no-repeat;
594 display: block; 593 display: block;
595 float: left; 594 float: left;
596 } 595 }
src/noosfero-spb/noosfero-spb-theme/css/use-report.css
@@ -322,8 +322,12 @@ @@ -322,8 +322,12 @@
322 padding-right: 6px; 322 padding-right: 6px;
323 } 323 }
324 324
  325 +/*FIX_ME - tmp css solution for development tmp solution, remove when fixed on plugin*/
  326 +
325 #content .star-rate-form .star-comment-container .comments-software-extra-fields #organization_rating_people_benefited, 327 #content .star-rate-form .star-comment-container .comments-software-extra-fields #organization_rating_people_benefited,
326 -#content .star-rate-form .star-comment-container .comments-software-extra-fields #organization_rating_saved_value { 328 +#content .star-rate-form .star-comment-container .comments-software-extra-fields #organization_rating_saved_value,
  329 +#content .star-rate-form .star-comment-container .comments-software-extra-fields #people_benefited_tmp,
  330 +#content .star-rate-form .star-comment-container .comments-software-extra-fields #saved_value_tmp {
327 display: block; 331 display: block;
328 height: 19px; 332 height: 19px;
329 width: 155px; 333 width: 155px;
@@ -344,13 +348,17 @@ @@ -344,13 +348,17 @@
344 #content .star-rate-form .star-comment-container .star-tooltip { 348 #content .star-rate-form .star-comment-container .star-tooltip {
345 cursor: default; 349 cursor: default;
346 content: '?'; 350 content: '?';
347 - border-radius: 90%;  
348 - font-size: 12px;  
349 - font-weight: 700;  
350 - background: #3867b7;  
351 - color: #fff;  
352 - margin-left: 4px;  
353 - padding: 0px 6px; 351 + padding-top: 2px;
  352 + background-color: #3867b7;
  353 + color: #ffffff;
  354 + font-weight: bold;
  355 + cursor: pointer;
  356 + height: 15px;
  357 + font-family: arial;
  358 + width: 17px;
  359 + display: inline-block;
  360 + text-align: center;
  361 + border-radius: 50%
354 } 362 }
355 363
356 .ratings-list { 364 .ratings-list {
src/noosfero-spb/noosfero-spb-theme/images/history-mini_icon.png 0 → 100644

476 Bytes

src/noosfero-spb/noosfero-spb-theme/images/ic-doc.png 0 → 100644

268 Bytes

src/noosfero-spb/noosfero-spb-theme/theme.js
@@ -268,10 +268,15 @@ $(&#39;#link-buscar&#39;).click(function(e) { @@ -268,10 +268,15 @@ $(&#39;#link-buscar&#39;).click(function(e) {
268 } 268 }
269 } 269 }
270 270
  271 + function move_breadcrumbs() {
  272 + $('.breadcrumbs-plugin_content-breadcrumbs-block').prependTo('#wrap-2');
  273 + }
  274 +
271 $(document).ready(function(){ 275 $(document).ready(function(){
272 add_tooltips(); 276 add_tooltips();
273 add_popovers(); 277 add_popovers();
274 move_article_buttons(); 278 move_article_buttons();
  279 + move_breadcrumbs();
275 insert_notice_div(); 280 insert_notice_div();
276 set_uploaded_files_names(); 281 set_uploaded_files_names();
277 set_tooltip_content(); 282 set_tooltip_content();
src/noosfero-spb/software_communities/controllers/software_communities_plugin_controller.rb
@@ -5,11 +5,9 @@ class SoftwareCommunitiesPluginController &lt; ApplicationController @@ -5,11 +5,9 @@ class SoftwareCommunitiesPluginController &lt; ApplicationController
5 def get_license_data 5 def get_license_data
6 return render :json=>{} if !request.xhr? || params[:query].nil? 6 return render :json=>{} if !request.xhr? || params[:query].nil?
7 7
8 - data = if params[:query].empty?  
9 - LicenseInfo.all  
10 - else  
11 - LicenseInfo.where("version ILIKE ?", "%#{params[:query]}%").select("id, version")  
12 - end 8 + data = LicenseHelper.find_licenses(params[:query]) if params[:query]
  9 + data ||= LicenseInfo.all
  10 +
13 render :json=> data.collect { |license| 11 render :json=> data.collect { |license|
14 {:id=>license.id, :label=>license.version} 12 {:id=>license.id, :label=>license.version}
15 } 13 }
@@ -44,11 +42,7 @@ class SoftwareCommunitiesPluginController &lt; ApplicationController @@ -44,11 +42,7 @@ class SoftwareCommunitiesPluginController &lt; ApplicationController
44 protected 42 protected
45 43
46 def get_model_by_params_field 44 def get_model_by_params_field
47 - case params[:field]  
48 - when "software_language"  
49 - return ProgrammingLanguage  
50 - else  
51 - return DatabaseDescription  
52 - end 45 + return DatabaseDescription unless params[:field] == "software_language"
  46 + return ProgrammingLanguage
53 end 47 end
54 end 48 end
src/noosfero-spb/software_communities/controllers/software_communities_plugin_myprofile_controller.rb
@@ -9,13 +9,13 @@ class SoftwareCommunitiesPluginMyprofileController &lt; MyProfileController @@ -9,13 +9,13 @@ class SoftwareCommunitiesPluginMyprofileController &lt; MyProfileController
9 9
10 @community = Community.new(params[:community]) 10 @community = Community.new(params[:community])
11 @community.environment = environment 11 @community.environment = environment
12 - @software_info = SoftwareInfo.new(params[:software_info])  
13 12
14 - @license_info = if params[:license].blank? or params[:license][:license_infos_id].blank?  
15 - LicenseInfo.new  
16 - else  
17 - LicenseInfo.find(params[:license][:license_infos_id])  
18 - end 13 + @license_info = LicenseInfo.find_by_id(params[:license][:license_infos_id]) if params[:license]
  14 + @license_info ||= LicenseInfo.new
  15 +
  16 + @software_info = SoftwareInfo.new(params[:software_info])
  17 + @software_info.community = @community
  18 + @software_info.license_info = @license_info
19 19
20 control_software_creation 20 control_software_creation
21 update_new_software_errors 21 update_new_software_errors
@@ -26,14 +26,15 @@ class SoftwareCommunitiesPluginMyprofileController &lt; MyProfileController @@ -26,14 +26,15 @@ class SoftwareCommunitiesPluginMyprofileController &lt; MyProfileController
26 26
27 return unless request.post? 27 return unless request.post?
28 28
29 - @software_info = constroy_software 29 + @software_info = create_software
30 software_info_insert_models.call(@list_libraries, 'libraries') 30 software_info_insert_models.call(@list_libraries, 'libraries')
31 software_info_insert_models.call(@list_languages, 'software_languages') 31 software_info_insert_models.call(@list_languages, 'software_languages')
32 software_info_insert_models.call(@list_databases, 'software_databases') 32 software_info_insert_models.call(@list_databases, 'software_databases')
33 software_info_insert_models.call(@list_operating_systems, 'operating_systems') 33 software_info_insert_models.call(@list_operating_systems, 'operating_systems')
34 34
35 begin 35 begin
36 - @software_info.save! 36 + raise NotAdminException unless can_change_public_software?
  37 + @software_info.update_attributes!(params[:software])
37 38
38 @community = @software_info.community 39 @community = @software_info.community
39 @community.update_attributes!(params[:community]) 40 @community.update_attributes!(params[:community])
@@ -44,31 +45,50 @@ class SoftwareCommunitiesPluginMyprofileController &lt; MyProfileController @@ -44,31 +45,50 @@ class SoftwareCommunitiesPluginMyprofileController &lt; MyProfileController
44 redirect_to :controller => 'profile_editor', :action => 'index' 45 redirect_to :controller => 'profile_editor', :action => 'index'
45 session[:notice] = _('Software updated successfully') 46 session[:notice] = _('Software updated successfully')
46 end 47 end
47 - rescue ActiveRecord::RecordInvalid => invalid 48 + rescue NotAdminException, ActiveRecord::RecordInvalid => invalid
48 update_new_software_errors 49 update_new_software_errors
49 session[:notice] = _('Could not update software') 50 session[:notice] = _('Could not update software')
50 end 51 end
51 end 52 end
52 53
53 - def disabled_public_software_field  
54 - !environment.admins.include?(current_user.person)  
55 - end  
56 -  
57 private 54 private
58 55
  56 + def can_change_public_software?
  57 + if !user.is_admin?(environment)
  58 + if params[:software][:public_software]
  59 + @software_info.errors.add(:public_software, _("You don't have permission to change public software status"))
  60 + return false
  61 + end
  62 +
  63 + if params[:software].keys.any?{|key| ["e_ping","e_mag","icp_brasil","e_arq","intern"].include?(key)}
  64 + @software_info.errors.add(:base, _("You don't have permission to change public software attributes"))
  65 + return false
  66 + end
  67 + end
  68 + return true
  69 + end
  70 +
59 def add_software_erros 71 def add_software_erros
60 @errors = [] 72 @errors = []
61 - @errors |= @community.errors.full_messages if @community 73 + if @community
  74 + error = @community.errors.delete(:identifier)
  75 + @errors |= [_("Domain %s") % error.first ] if error
  76 + @errors |= @community.errors.full_messages
  77 + end
62 @errors |= @software_info.errors.full_messages if @software_info 78 @errors |= @software_info.errors.full_messages if @software_info
63 @errors |= @license_info.errors.full_messages if @license_info 79 @errors |= @license_info.errors.full_messages if @license_info
64 end 80 end
65 81
66 def control_software_creation 82 def control_software_creation
67 - valid_models = request.post? && (@community.valid? && @software_info.valid? && @license_info.valid?)  
68 - if valid_models  
69 - send_software_to_moderation  
70 - else  
71 - add_software_erros 83 + if request.post?
  84 + valid_models = @community.valid?
  85 + valid_models &= @software_info.valid?
  86 + valid_models &= @license_info.valid?
  87 + if valid_models
  88 + send_software_to_moderation
  89 + else
  90 + add_software_erros
  91 + end
72 end 92 end
73 end 93 end
74 94
@@ -79,16 +99,14 @@ class SoftwareCommunitiesPluginMyprofileController &lt; MyProfileController @@ -79,16 +99,14 @@ class SoftwareCommunitiesPluginMyprofileController &lt; MyProfileController
79 } 99 }
80 end 100 end
81 101
82 - def constroy_software 102 + def create_software
83 @software_info = @profile.software_info 103 @software_info = @profile.software_info
84 - params[:software][:public_software] ||= false unless @software_info.public_software?  
85 - @license = LicenseInfo.find(params[:license][:license_infos_id])  
86 - @software_info.license_info = @license  
87 - @software_info.update_attributes(params[:software])  
88 -  
89 another_license_version = nil 104 another_license_version = nil
90 another_license_link = nil 105 another_license_link = nil
91 if params[:license] 106 if params[:license]
  107 + @license = LicenseInfo.find(params[:license][:license_infos_id])
  108 + @software_info.license_info = @license
  109 +
92 another_license_version = params[:license][:version] 110 another_license_version = params[:license][:version]
93 another_license_link = params[:license][:link] 111 another_license_link = params[:license][:link]
94 end 112 end
@@ -126,7 +144,7 @@ class SoftwareCommunitiesPluginMyprofileController &lt; MyProfileController @@ -126,7 +144,7 @@ class SoftwareCommunitiesPluginMyprofileController &lt; MyProfileController
126 144
127 add_admin_to_community 145 add_admin_to_community
128 146
129 - if !environment.admins.include?(current_user.person) 147 + if !environment.admins.include?(current_user.person)
130 session[:notice] = _('Your new software request will be evaluated by an'\ 148 session[:notice] = _('Your new software request will be evaluated by an'\
131 'administrator. You will be notified.') 149 'administrator. You will be notified.')
132 redirect_to user.admin_url 150 redirect_to user.admin_url
@@ -143,7 +161,7 @@ class SoftwareCommunitiesPluginMyprofileController &lt; MyProfileController @@ -143,7 +161,7 @@ class SoftwareCommunitiesPluginMyprofileController &lt; MyProfileController
143 @list_databases = @software_info.software_databases 161 @list_databases = @software_info.software_databases
144 @list_languages = @software_info.software_languages 162 @list_languages = @software_info.software_languages
145 @list_operating_systems = @software_info.operating_systems 163 @list_operating_systems = @software_info.operating_systems
146 - @disabled_public_software_field = disabled_public_software_field 164 + @non_admin_status = 'disabled' unless user.is_admin?(environment)
147 165
148 @license_version = @software_info.license_info.version 166 @license_version = @software_info.license_info.version
149 @license_id = @software_info.license_info.id 167 @license_id = @software_info.license_info.id
@@ -184,7 +202,6 @@ class SoftwareCommunitiesPluginMyprofileController &lt; MyProfileController @@ -184,7 +202,6 @@ class SoftwareCommunitiesPluginMyprofileController &lt; MyProfileController
184 add_software_erros 202 add_software_erros
185 end 203 end
186 204
187 -  
188 @error_community_name = @community.errors.include?(:name) ? "highlight-error" : "" if @community 205 @error_community_name = @community.errors.include?(:name) ? "highlight-error" : "" if @community
189 @error_software_acronym = @software_info.errors.include?(:acronym) ? "highlight-error" : "" if @software_info 206 @error_software_acronym = @software_info.errors.include?(:acronym) ? "highlight-error" : "" if @software_info
190 @error_software_domain = @community.errors.include?(:identifier) ? "highlight-error" : "" if @community 207 @error_software_domain = @community.errors.include?(:identifier) ? "highlight-error" : "" if @community
@@ -192,3 +209,5 @@ class SoftwareCommunitiesPluginMyprofileController &lt; MyProfileController @@ -192,3 +209,5 @@ class SoftwareCommunitiesPluginMyprofileController &lt; MyProfileController
192 @error_software_license = @license_info.errors.include?(:version) ? "highlight-error" : "" if @license_info 209 @error_software_license = @license_info.errors.include?(:version) ? "highlight-error" : "" if @license_info
193 end 210 end
194 end 211 end
  212 +
  213 +class NotAdminException < Exception; end
src/noosfero-spb/software_communities/features/software_catalog.feature
@@ -80,3 +80,33 @@ Feature: Search software @@ -80,3 +80,33 @@ Feature: Search software
80 Then I should see "Software One" 80 Then I should see "Software One"
81 And I should see "Software Two" 81 And I should see "Software Two"
82 And I should see "Software Three" 82 And I should see "Software Three"
  83 +
  84 + @selenium
  85 + Scenario: See software rating on catalog
  86 + Given plugin "OrganizationRatings" is enabled on environment
  87 + And I am logged in as mpog_admin
  88 + And I go to /admin/plugins
  89 + And I check "Organization Ratings"
  90 + And I press "Save changes"
  91 + And I go to /admin/admin_panel/site_info
  92 + And I select "Software Público" from "environment_theme"
  93 + And I press "Save"
  94 + And I go to /account/logout
  95 + Given the following user
  96 + | login | name |
  97 + | joaosilva | Joao Silva |
  98 + And the following blocks
  99 + | owner | type |
  100 + | software-two | AverageRatingBlock |
  101 + | software-two | OrganizationRatingsBlock |
  102 + And the environment domain is "localhost"
  103 + And I am logged in as "joaosilva"
  104 + And I go to /profile/software-two/plugin/organization_ratings/new_rating
  105 + And I press "Enviar"
  106 + And I go to /search/software_infos
  107 + When I select "Favorites" from "sort"
  108 + And I sleep for 3 seconds
  109 + Then I should see "Software Two" before "Software One"
  110 + And there should be 1 div with class "small-star-positive"
  111 + And there should be 4 divs with class "small-star-negative"
  112 +
src/noosfero-spb/software_communities/features/step_definitions/software_communities_steps.rb
@@ -194,7 +194,7 @@ Given /^the user &quot;([^&quot;]*)&quot; has &quot;([^&quot;]*)&quot; as secondary e\-mail$/ do |login, email @@ -194,7 +194,7 @@ Given /^the user &quot;([^&quot;]*)&quot; has &quot;([^&quot;]*)&quot; as secondary e\-mail$/ do |login, email
194 end 194 end
195 195
196 Given /^I click on anything with selector "([^"]*)"$/ do |selector| 196 Given /^I click on anything with selector "([^"]*)"$/ do |selector|
197 - evaluate_script "jQuery('#{selector}').trigger('click') && true" 197 + page.evaluate_script("jQuery('##{selector}').click();")
198 end 198 end
199 199
200 Given /^I should see "([^"]*)" of this selector "([^"]*)"$/ do |quantity, selector| 200 Given /^I should see "([^"]*)" of this selector "([^"]*)"$/ do |quantity, selector|
@@ -243,3 +243,7 @@ Given /^I keyup on selector &quot;([^&quot;]*)&quot;$/ do |selector| @@ -243,3 +243,7 @@ Given /^I keyup on selector &quot;([^&quot;]*)&quot;$/ do |selector|
243 selector_founded = evaluate_script("jQuery('#{selector}').trigger('keyup').length != 0") 243 selector_founded = evaluate_script("jQuery('#{selector}').trigger('keyup').length != 0")
244 selector_founded.should be_true 244 selector_founded.should be_true
245 end 245 end
  246 +
  247 +Then /^there should be (\d+) divs? with class "([^"]*)"$/ do |count, klass|
  248 + should have_selector("div.#{klass}", :count => count)
  249 +end
src/noosfero-spb/software_communities/features/use_report.feature 0 → 100644
@@ -0,0 +1,56 @@ @@ -0,0 +1,56 @@
  1 +Feature: Use report
  2 + As a user
  3 + I want to make a use report of a software
  4 + to give my feedback about a software.
  5 +
  6 + Background:
  7 + Given "SoftwareCommunitiesPlugin" plugin is enabled
  8 + Given "OrganizationRatings" plugin is enabled
  9 + And I am logged in as mpog_admin
  10 + And I go to /admin/plugins
  11 + And I check "SoftwareCommunitiesPlugin"
  12 + And I press "Save changes"
  13 + And the following softwares
  14 + | name | public_software | finality |
  15 + | Noosfero | true | some finality |
  16 +
  17 + Scenario: Add Organization Ratings Block
  18 + Given I go to Noosfero's control panel
  19 + And I follow "Edit sideboxes"
  20 + When I follow "Add a block"
  21 + And I choose "Organization Ratings"
  22 + And I press "Add"
  23 + Then I should see "Report your experiences"
  24 +
  25 + Scenario: Add Average Rating Block
  26 + Given I go to Noosfero's control panel
  27 + And I follow "Edit sideboxes"
  28 + When I follow "Add a block"
  29 + And I choose "Organization Average Rating"
  30 + And I press "Add"
  31 + Then I should see "Be the first to rate!"
  32 +
  33 + @selenium
  34 + Scenario: Test Additional Fields JavaScript
  35 + Given I go to /profile/noosfero/plugin/organization_ratings/new_rating
  36 + Then I should not see "Number of Beneficiaries"
  37 + And I should not see "Saved Resources"
  38 + When I click on anything with selector "comments-additional-information"
  39 + Then I should see "Number of Beneficiaries"
  40 + And I should see "Saved Resources"
  41 +
  42 + @selenium
  43 + Scenario: Validate Use Report fields format
  44 + Given I go to Noosfero's control panel
  45 + Given I follow "Edit sideboxes"
  46 + When I follow "Add a block"
  47 + And I choose "Organization Ratings"
  48 + And I press "Add"
  49 + And I am on Noosfero's homepage
  50 + And I follow "Rate Community"
  51 + When I click on anything with selector "comments-additional-information"
  52 + And I fill in "organization_rating_people_benefited" with "123123"
  53 + And I fill in "organization_rating_saved_value" with "7654321"
  54 + And I press "Save"
  55 + Then I should see "Benefited People: 123.123"
  56 + And I should see "Saved Resources: $ 76,543.21"
src/noosfero-spb/software_communities/lib/create_software.rb
@@ -5,12 +5,14 @@ class CreateSoftware &lt; Task @@ -5,12 +5,14 @@ class CreateSoftware &lt; Task
5 validates_presence_of :name 5 validates_presence_of :name
6 6
7 attr_accessible :name, :finality, :repository_link, :requestor, :environment, 7 attr_accessible :name, :finality, :repository_link, :requestor, :environment,
8 - :reject_explanation, :license_info 8 + :reject_explanation, :license_info, :identifier, :another_license_version,
  9 + :another_license_link
9 10
10 alias :environment :target 11 alias :environment :target
11 alias :environment= :target= 12 alias :environment= :target=
12 13
13 - DATA_FIELDS = ['name', 'finality', 'license_info', 'repository_link'] 14 + DATA_FIELDS = ['name', 'identifier', 'finality', 'license_info', 'repository_link',
  15 + 'another_license_version', 'another_license_link']
14 DATA_FIELDS.each do |field| 16 DATA_FIELDS.each do |field|
15 settings_items field.to_sym 17 settings_items field.to_sym
16 end 18 end
@@ -21,15 +23,21 @@ class CreateSoftware &lt; Task @@ -21,15 +23,21 @@ class CreateSoftware &lt; Task
21 template_id = software_template.id 23 template_id = software_template.id
22 end 24 end
23 25
  26 + identifier = self.identifier
  27 + identifier ||= self.name.to_slug
  28 +
24 community = Community.create!(:name => self.name, 29 community = Community.create!(:name => self.name,
  30 + :identifier => identifier,
25 :template_id => template_id) 31 :template_id => template_id)
26 32
27 community.environment = self.environment 33 community.environment = self.environment
28 community.add_admin(self.requestor) 34 community.add_admin(self.requestor)
29 35
30 - software = SoftwareInfo.create!(:finality => self.finality, 36 + software = SoftwareInfo.new(:finality => self.finality,
31 :repository_link => self.repository_link, :community_id => community.id, 37 :repository_link => self.repository_link, :community_id => community.id,
32 :license_info => self.license_info) 38 :license_info => self.license_info)
  39 + software.verify_license_info(self.another_license_version, self.another_license_link)
  40 + software.save!
33 end 41 end
34 42
35 def title 43 def title
src/noosfero-spb/software_communities/lib/database_helper.rb
@@ -34,12 +34,7 @@ class DatabaseHelper &lt; DynamicTableHelper @@ -34,12 +34,7 @@ class DatabaseHelper &lt; DynamicTableHelper
34 34
35 def self.valid_list_database? list_databases 35 def self.valid_list_database? list_databases
36 return false if list_databases.nil? or list_databases.length == 0 36 return false if list_databases.nil? or list_databases.length == 0
37 -  
38 - list_databases.each do |database|  
39 - return false unless database.valid?  
40 - end  
41 -  
42 - true 37 + return !list_databases.any?{|database| !database.valid?}
43 end 38 end
44 39
45 def self.database_as_tables(list_databases, disabled=false) 40 def self.database_as_tables(list_databases, disabled=false)
@@ -51,14 +46,10 @@ class DatabaseHelper &lt; DynamicTableHelper @@ -51,14 +46,10 @@ class DatabaseHelper &lt; DynamicTableHelper
51 46
52 def self.database_html_structure(database_data, disabled) 47 def self.database_html_structure(database_data, disabled)
53 database_id = database_data[:database_description_id] 48 database_id = database_data[:database_description_id]
54 - database_name = if database_data[:database_description_id].blank?  
55 - ""  
56 - else  
57 - DatabaseDescription.find( 49 + database_name = database_id.blank? ? "" : DatabaseDescription.find(
58 database_data[:database_description_id], 50 database_data[:database_description_id],
59 :select=>"name" 51 :select=>"name"
60 ).name 52 ).name
61 - end  
62 53
63 data = { 54 data = {
64 model_name: MODEL_NAME, 55 model_name: MODEL_NAME,
@@ -83,4 +74,4 @@ class DatabaseHelper &lt; DynamicTableHelper @@ -83,4 +74,4 @@ class DatabaseHelper &lt; DynamicTableHelper
83 def self.add_dynamic_table 74 def self.add_dynamic_table
84 database_as_tables(nil).first.call 75 database_as_tables(nil).first.call
85 end 76 end
86 -end  
87 \ No newline at end of file 77 \ No newline at end of file
  78 +end
src/noosfero-spb/software_communities/lib/ext/search_controller.rb
@@ -105,6 +105,8 @@ class SearchController @@ -105,6 +105,8 @@ class SearchController
105 communities_list.reverse! 105 communities_list.reverse!
106 elsif params[:sort] && params[:sort] == "relevance" 106 elsif params[:sort] && params[:sort] == "relevance"
107 communities_list = sort_by_relevance(communities_list, params[:query]){ |community| [community.software_info.finality, community.name] } 107 communities_list = sort_by_relevance(communities_list, params[:query]){ |community| [community.software_info.finality, community.name] }
  108 + elsif params[:sort] && params[:sort] == "rating"
  109 + communities_list = sort_by_average_rating(communities_list)
108 end 110 end
109 communities_list 111 communities_list
110 end 112 end
src/noosfero-spb/software_communities/lib/ext/search_helper.rb
@@ -30,4 +30,16 @@ module SearchHelper @@ -30,4 +30,16 @@ module SearchHelper
30 list 30 list
31 end 31 end
32 32
  33 + def sort_by_average_rating list
  34 + list.sort! do |a, b|
  35 + rating_a = OrganizationRating.average_rating(a.id)
  36 + rating_a = 0 if rating_a.nil?
  37 + rating_b = OrganizationRating.average_rating(b.id)
  38 + rating_b = 0 if rating_b.nil?
  39 + rating_a - rating_b
  40 + end
  41 +
  42 + list.reverse!
  43 + end
  44 +
33 end 45 end
src/noosfero-spb/software_communities/lib/library_helper.rb
@@ -20,12 +20,7 @@ class LibraryHelper &lt; DynamicTableHelper @@ -20,12 +20,7 @@ class LibraryHelper &lt; DynamicTableHelper
20 20
21 def self.valid_list_library? list_libraries 21 def self.valid_list_library? list_libraries
22 return true if list_libraries.nil? or list_libraries.length == 0 22 return true if list_libraries.nil? or list_libraries.length == 0
23 -  
24 - list_libraries.each do |library|  
25 - return false unless library.valid?  
26 - end  
27 -  
28 - true 23 + return !list_libraries.any?{|library| !library.valid?}
29 end 24 end
30 25
31 def self.libraries_as_tables list_libraries, disabled=false 26 def self.libraries_as_tables list_libraries, disabled=false
@@ -59,4 +54,4 @@ class LibraryHelper &lt; DynamicTableHelper @@ -59,4 +54,4 @@ class LibraryHelper &lt; DynamicTableHelper
59 def self.add_dynamic_table 54 def self.add_dynamic_table
60 libraries_as_tables(nil).first.call 55 libraries_as_tables(nil).first.call
61 end 56 end
62 -end  
63 \ No newline at end of file 57 \ No newline at end of file
  58 +end
src/noosfero-spb/software_communities/lib/license_helper.rb
1 module LicenseHelper 1 module LicenseHelper
2 - def self.getListLicenses  
3 - LicenseInfo.all 2 + def self.find_licenses query
  3 + licenses = LicenseInfo.where("version ILIKE ?", "%#{query}%").select("id, version")
  4 + licenses.reject!{|license| license.version == "Another"}
  5 + license_another = LicenseInfo.find_by_version("Another")
  6 + licenses << license_another if license_another
  7 + licenses
4 end 8 end
5 -end  
6 \ No newline at end of file 9 \ No newline at end of file
  10 +end
src/noosfero-spb/software_communities/lib/operating_system_helper.rb
@@ -25,12 +25,8 @@ class OperatingSystemHelper &lt; DynamicTableHelper @@ -25,12 +25,8 @@ class OperatingSystemHelper &lt; DynamicTableHelper
25 end 25 end
26 26
27 def self.valid_list_operating_system? list_operating_system 27 def self.valid_list_operating_system? list_operating_system
28 - return !(list_operating_system.nil? || list_operating_system.length == 0)  
29 -  
30 - list_operating_system.each do |operating_system|  
31 - return false unless operating_system.valid?  
32 - end  
33 - true 28 + return false if (list_operating_system.nil? || list_operating_system.length == 0)
  29 + return !list_operating_system.any?{|os| !os.valid?}
34 end 30 end
35 31
36 def self.operating_system_as_tables(list_operating_system, disabled=false) 32 def self.operating_system_as_tables(list_operating_system, disabled=false)
src/noosfero-spb/software_communities/lib/software_communities_plugin.rb
@@ -17,9 +17,13 @@ class SoftwareCommunitiesPlugin &lt; Noosfero::Plugin @@ -17,9 +17,13 @@ class SoftwareCommunitiesPlugin &lt; Noosfero::Plugin
17 _('Add Public Software and MPOG features.') 17 _('Add Public Software and MPOG features.')
18 end 18 end
19 19
  20 + def self.api_mount_points
  21 + [SoftwareCommunitiesPlugin::API]
  22 + end
  23 +
20 def profile_tabs 24 def profile_tabs
21 - if context.profile.community?  
22 - return profile_tabs_software if context.profile.software? 25 + if context.profile.community? && context.profile.software?
  26 + return profile_tabs_software
23 end 27 end
24 end 28 end
25 29
@@ -43,7 +47,8 @@ class SoftwareCommunitiesPlugin &lt; Noosfero::Plugin @@ -43,7 +47,8 @@ class SoftwareCommunitiesPlugin &lt; Noosfero::Plugin
43 SoftwareHighlightsBlock => { :type => [Environment] }, 47 SoftwareHighlightsBlock => { :type => [Environment] },
44 SoftwareTabDataBlock => {:type => [Community], :position => 1}, 48 SoftwareTabDataBlock => {:type => [Community], :position => 1},
45 WikiBlock => {:type => [Community]}, 49 WikiBlock => {:type => [Community]},
46 - StatisticBlock => { :type => [Community] } 50 + StatisticBlock => { :type => [Community] },
  51 + SoftwareEventsBlock => { :type => [Community] }
47 } 52 }
48 end 53 end
49 54
@@ -102,7 +107,6 @@ class SoftwareCommunitiesPlugin &lt; Noosfero::Plugin @@ -102,7 +107,6 @@ class SoftwareCommunitiesPlugin &lt; Noosfero::Plugin
102 is_admin ||= user_rating.organization.admins.include?(current_user.person) 107 is_admin ||= user_rating.organization.admins.include?(current_user.person)
103 108
104 if is_admin and profile.software? 109 if is_admin and profile.software?
105 -  
106 render :file => 'organization_ratings_extra_fields_show_data', 110 render :file => 'organization_ratings_extra_fields_show_data',
107 :locals => {:user_rating => user_rating} 111 :locals => {:user_rating => user_rating}
108 end 112 end
src/noosfero-spb/software_communities/lib/software_communities_plugin/api.rb 0 → 100644
@@ -0,0 +1,23 @@ @@ -0,0 +1,23 @@
  1 +require File.dirname(__FILE__) + '/../../../../../lib/noosfero/api/helpers'
  2 +require_relative 'api_entities'
  3 +
  4 +class SoftwareCommunitiesPlugin::API < Grape::API
  5 +
  6 + include Noosfero::API::APIHelpers
  7 +
  8 + resource :software_communities do
  9 + get do
  10 + authenticate!
  11 + softwares = select_filtered_collection_of(environment,'communities',params).joins(:software_info)
  12 + present softwares.map{|o|o.software_info}, :with => Entities::SoftwareInfo
  13 + end
  14 +
  15 + get ':id' do
  16 + authenticate!
  17 + software = SoftwareInfo.find_by_id(params[:id])
  18 + present software, :with => Entities::SoftwareInfo
  19 + end
  20 +
  21 + end
  22 +end
  23 +
src/noosfero-spb/software_communities/lib/software_communities_plugin/api_entities.rb 0 → 100644
@@ -0,0 +1,10 @@ @@ -0,0 +1,10 @@
  1 +module Entities
  2 + class SoftwareInfo < Noosfero::API::Entity
  3 + root 'software_infos', 'software_info'
  4 + expose :id, :finality, :repository_link, :public_software, :acronym, :objectives,
  5 + :features,:license_info, :software_languages, :software_databases, :operating_system_names
  6 + expose :community_id do |software_info,options|
  7 + software_info.community.id
  8 + end
  9 + end
  10 +end
src/noosfero-spb/software_communities/lib/software_events_block.rb 0 → 100644
@@ -0,0 +1,44 @@ @@ -0,0 +1,44 @@
  1 +class SoftwareEventsBlock < Block
  2 +
  3 + def self.description
  4 + _('Software community events')
  5 + end
  6 +
  7 + def help
  8 + _('This block displays the software community events in a list.')
  9 + end
  10 +
  11 + def content(args={})
  12 + block = self
  13 +
  14 + lambda do |object|
  15 + render(
  16 + :file => 'blocks/software_events',
  17 + :locals => { :block => block }
  18 + )
  19 + end
  20 + end
  21 +
  22 + def cacheable?
  23 + false
  24 + end
  25 +
  26 + def get_events
  27 + today = DateTime.now.beginning_of_day
  28 + self.owner.events.where("end_date >= ?", today).order(:start_date)
  29 + end
  30 +
  31 + def get_events_except event_slug=""
  32 + event_slug = "" if event_slug.nil?
  33 +
  34 + get_events.where("slug NOT IN (?)", event_slug)
  35 + end
  36 +
  37 + def has_events_to_display?
  38 + not get_events.empty?
  39 + end
  40 +
  41 + def should_display_title?
  42 + self.box.position != 1
  43 + end
  44 +end
src/noosfero-spb/software_communities/lib/software_helper.rb
@@ -23,22 +23,6 @@ module SoftwareHelper @@ -23,22 +23,6 @@ module SoftwareHelper
23 end 23 end
24 24
25 def self.all_table_is_empty? table, ignored_fields=[] 25 def self.all_table_is_empty? table, ignored_fields=[]
26 - filled_fields = []  
27 -  
28 - table.each do |key, value|  
29 - unless ignored_fields.include? key  
30 - filled_fields << if value.empty?  
31 - false  
32 - else  
33 - true  
34 - end  
35 - end  
36 - end  
37 -  
38 - if filled_fields.include? true  
39 - false  
40 - else  
41 - true  
42 - end 26 + return !table.keys.any?{|key| ignored_fields.include?(key) ? false : !table[key].empty?}
43 end 27 end
44 end 28 end
src/noosfero-spb/software_communities/lib/software_info.rb
@@ -84,19 +84,19 @@ class SoftwareInfo &lt; ActiveRecord::Base @@ -84,19 +84,19 @@ class SoftwareInfo &lt; ActiveRecord::Base
84 validates_length_of :finality, :maximum => 120 84 validates_length_of :finality, :maximum => 120
85 validates_length_of :objectives, :maximum => 4000 85 validates_length_of :objectives, :maximum => 4000
86 validates_length_of :features, :maximum => 4000 86 validates_length_of :features, :maximum => 4000
87 - validates_presence_of :finality 87 + validates_presence_of :finality, :community
88 88
89 validate :validate_acronym 89 validate :validate_acronym
90 90
91 settings_items :another_license_version, :another_license_link 91 settings_items :another_license_version, :another_license_link
92 92
93 # used on find_by_contents 93 # used on find_by_contents
94 - scope :like_search, lambda{ |name| 94 + def self.like_search name
95 joins(:community).where( 95 joins(:community).where(
96 "name ILIKE ? OR acronym ILIKE ? OR finality ILIKE ?", 96 "name ILIKE ? OR acronym ILIKE ? OR finality ILIKE ?",
97 "%#{name}%", "%#{name}%", "%#{name}%" 97 "%#{name}%", "%#{name}%", "%#{name}%"
98 ) 98 )
99 - } 99 + end
100 100
101 scope :search, lambda { |name="", database_description_id = "", 101 scope :search, lambda { |name="", database_description_id = "",
102 programming_language_id = "", operating_system_name_id = "", 102 programming_language_id = "", operating_system_name_id = "",
@@ -166,13 +166,16 @@ class SoftwareInfo &lt; ActiveRecord::Base @@ -166,13 +166,16 @@ class SoftwareInfo &lt; ActiveRecord::Base
166 another_license_link = attributes.delete(:another_license_link) 166 another_license_link = attributes.delete(:another_license_link)
167 167
168 software_info = SoftwareInfo.new(attributes) 168 software_info = SoftwareInfo.new(attributes)
169 - if !environment.admins.include? requestor 169 + unless environment.admins.include? requestor
170 CreateSoftware.create!( 170 CreateSoftware.create!(
171 attributes.merge( 171 attributes.merge(
172 :requestor => requestor, 172 :requestor => requestor,
173 :environment => environment, 173 :environment => environment,
174 :name => name, 174 :name => name,
175 - :license_info => license_info 175 + :identifier => identifier,
  176 + :license_info => license_info,
  177 + :another_license_version => another_license_version,
  178 + :another_license_link => another_license_link
176 ) 179 )
177 ) 180 )
178 else 181 else
@@ -189,15 +192,15 @@ class SoftwareInfo &lt; ActiveRecord::Base @@ -189,15 +192,15 @@ class SoftwareInfo &lt; ActiveRecord::Base
189 community.template_id = software_template.id 192 community.template_id = software_template.id
190 end 193 end
191 194
192 - software_info.license_info = license_info  
193 - software_info.save  
194 - community.software_info = software_info  
195 community.save! 195 community.save!
196 community.add_admin(requestor) 196 community.add_admin(requestor)
  197 +
  198 + software_info.community = community
  199 + software_info.license_info = license_info
  200 + software_info.verify_license_info(another_license_version, another_license_link)
  201 + software_info.save!
197 end 202 end
198 203
199 - software_info.verify_license_info(another_license_version, another_license_link)  
200 - software_info.save!  
201 software_info 204 software_info
202 end 205 end
203 206
src/noosfero-spb/software_communities/lib/software_language_helper.rb
@@ -50,10 +50,9 @@ class SoftwareLanguageHelper &lt; DynamicTableHelper @@ -50,10 +50,9 @@ class SoftwareLanguageHelper &lt; DynamicTableHelper
50 50
51 def self.language_html_structure(language_data, disabled) 51 def self.language_html_structure(language_data, disabled)
52 language_id = language_data[:programming_language_id] 52 language_id = language_data[:programming_language_id]
53 - language_name = if language_data[:programming_language_id].blank?  
54 - ""  
55 - else  
56 - ProgrammingLanguage.find( 53 + language_name = ""
  54 + unless language_data[:programming_language_id].blank?
  55 + language_name = ProgrammingLanguage.find(
57 language_data[:programming_language_id], 56 language_data[:programming_language_id],
58 :select=>"name" 57 :select=>"name"
59 ).name 58 ).name
src/noosfero-spb/software_communities/public/style.css
@@ -114,3 +114,6 @@ @@ -114,3 +114,6 @@
114 overflow: auto; 114 overflow: auto;
115 } 115 }
116 116
  117 +.catalog_rating_block {
  118 + margin-top: 5px;
  119 +}
src/noosfero-spb/software_communities/public/vendor/jquery.maskedinput.min.js
1 -/*  
2 - Masked Input plugin for jQuery  
3 - Copyright (c) 2007-2013 Josh Bush (digitalbush.com)  
4 - Licensed under the MIT license (http://digitalbush.com/projects/masked-input-plugin/#license)  
5 - Version: 1.3.1  
6 -*/  
7 -(function(e){function t(){var e=document.createElement("input"),t="onpaste";return e.setAttribute(t,""),"function"==typeof e[t]?"paste":"input"}var n,a=t()+".mask",r=navigator.userAgent,i=/iphone/i.test(r),o=/android/i.test(r);e.mask={definitions:{9:"[0-9]",a:"[A-Za-z]","*":"[A-Za-z0-9]"},dataName:"rawMaskFn",placeholder:"_"},e.fn.extend({caret:function(e,t){var n;if(0!==this.length&&!this.is(":hidden"))return"number"==typeof e?(t="number"==typeof t?t:e,this.each(function(){this.setSelectionRange?this.setSelectionRange(e,t):this.createTextRange&&(n=this.createTextRange(),n.collapse(!0),n.moveEnd("character",t),n.moveStart("character",e),n.select())})):(this[0].setSelectionRange?(e=this[0].selectionStart,t=this[0].selectionEnd):document.selection&&document.selection.createRange&&(n=document.selection.createRange(),e=0-n.duplicate().moveStart("character",-1e5),t=e+n.text.length),{begin:e,end:t})},unmask:function(){return this.trigger("unmask")},mask:function(t,r){var c,l,s,u,f,h;return!t&&this.length>0?(c=e(this[0]),c.data(e.mask.dataName)()):(r=e.extend({placeholder:e.mask.placeholder,completed:null},r),l=e.mask.definitions,s=[],u=h=t.length,f=null,e.each(t.split(""),function(e,t){"?"==t?(h--,u=e):l[t]?(s.push(RegExp(l[t])),null===f&&(f=s.length-1)):s.push(null)}),this.trigger("unmask").each(function(){function c(e){for(;h>++e&&!s[e];);return e}function d(e){for(;--e>=0&&!s[e];);return e}function m(e,t){var n,a;if(!(0>e)){for(n=e,a=c(t);h>n;n++)if(s[n]){if(!(h>a&&s[n].test(R[a])))break;R[n]=R[a],R[a]=r.placeholder,a=c(a)}b(),x.caret(Math.max(f,e))}}function p(e){var t,n,a,i;for(t=e,n=r.placeholder;h>t;t++)if(s[t]){if(a=c(t),i=R[t],R[t]=n,!(h>a&&s[a].test(i)))break;n=i}}function g(e){var t,n,a,r=e.which;8===r||46===r||i&&127===r?(t=x.caret(),n=t.begin,a=t.end,0===a-n&&(n=46!==r?d(n):a=c(n-1),a=46===r?c(a):a),k(n,a),m(n,a-1),e.preventDefault()):27==r&&(x.val(S),x.caret(0,y()),e.preventDefault())}function v(t){var n,a,i,l=t.which,u=x.caret();t.ctrlKey||t.altKey||t.metaKey||32>l||l&&(0!==u.end-u.begin&&(k(u.begin,u.end),m(u.begin,u.end-1)),n=c(u.begin-1),h>n&&(a=String.fromCharCode(l),s[n].test(a)&&(p(n),R[n]=a,b(),i=c(n),o?setTimeout(e.proxy(e.fn.caret,x,i),0):x.caret(i),r.completed&&i>=h&&r.completed.call(x))),t.preventDefault())}function k(e,t){var n;for(n=e;t>n&&h>n;n++)s[n]&&(R[n]=r.placeholder)}function b(){x.val(R.join(""))}function y(e){var t,n,a=x.val(),i=-1;for(t=0,pos=0;h>t;t++)if(s[t]){for(R[t]=r.placeholder;pos++<a.length;)if(n=a.charAt(pos-1),s[t].test(n)){R[t]=n,i=t;break}if(pos>a.length)break}else R[t]===a.charAt(pos)&&t!==u&&(pos++,i=t);return e?b():u>i+1?(x.val(""),k(0,h)):(b(),x.val(x.val().substring(0,i+1))),u?t:f}var x=e(this),R=e.map(t.split(""),function(e){return"?"!=e?l[e]?r.placeholder:e:void 0}),S=x.val();x.data(e.mask.dataName,function(){return e.map(R,function(e,t){return s[t]&&e!=r.placeholder?e:null}).join("")}),x.attr("readonly")||x.one("unmask",function(){x.unbind(".mask").removeData(e.mask.dataName)}).bind("focus.mask",function(){clearTimeout(n);var e;S=x.val(),e=y(),n=setTimeout(function(){b(),e==t.length?x.caret(0,e):x.caret(e)},10)}).bind("blur.mask",function(){y(),x.val()!=S&&x.change()}).bind("keydown.mask",g).bind("keypress.mask",v).bind(a,function(){setTimeout(function(){var e=y(!0);x.caret(e),r.completed&&e==x.val().length&&r.completed.call(x)},0)}),y()}))}})})(jQuery);  
8 \ No newline at end of file 1 \ No newline at end of file
  2 +// jQuery Mask Plugin v1.13.4
  3 +// github.com/igorescobar/jQuery-Mask-Plugin
  4 +(function(b){"function"===typeof define&&define.amd?define(["jquery"],b):"object"===typeof exports?module.exports=b(require("jquery")):b(jQuery||Zepto)})(function(b){var y=function(a,c,d){a=b(a);var g=this,k=a.val(),l;c="function"===typeof c?c(a.val(),void 0,a,d):c;var e={invalid:[],getCaret:function(){try{var q,b=0,e=a.get(0),f=document.selection,c=e.selectionStart;if(f&&-1===navigator.appVersion.indexOf("MSIE 10"))q=f.createRange(),q.moveStart("character",a.is("input")?-a.val().length:-a.text().length),
  5 +b=q.text.length;else if(c||"0"===c)b=c;return b}catch(d){}},setCaret:function(q){try{if(a.is(":focus")){var b,c=a.get(0);c.setSelectionRange?c.setSelectionRange(q,q):c.createTextRange&&(b=c.createTextRange(),b.collapse(!0),b.moveEnd("character",q),b.moveStart("character",q),b.select())}}catch(f){}},events:function(){a.on("input.mask keyup.mask",e.behaviour).on("paste.mask drop.mask",function(){setTimeout(function(){a.keydown().keyup()},100)}).on("change.mask",function(){a.data("changed",!0)}).on("blur.mask",
  6 +function(){k===a.val()||a.data("changed")||a.triggerHandler("change");a.data("changed",!1)}).on("blur.mask",function(){k=a.val()}).on("focus.mask",function(a){!0===d.selectOnFocus&&b(a.target).select()}).on("focusout.mask",function(){d.clearIfNotMatch&&!l.test(e.val())&&e.val("")})},getRegexMask:function(){for(var a=[],b,e,f,d,h=0;h<c.length;h++)(b=g.translation[c.charAt(h)])?(e=b.pattern.toString().replace(/.{1}$|^.{1}/g,""),f=b.optional,(b=b.recursive)?(a.push(c.charAt(h)),d={digit:c.charAt(h),
  7 +pattern:e}):a.push(f||b?e+"?":e)):a.push(c.charAt(h).replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&"));a=a.join("");d&&(a=a.replace(new RegExp("("+d.digit+"(.*"+d.digit+")?)"),"($1)?").replace(new RegExp(d.digit,"g"),d.pattern));return new RegExp(a)},destroyEvents:function(){a.off("input keydown keyup paste drop blur focusout ".split(" ").join(".mask "))},val:function(b){var c=a.is("input")?"val":"text";if(0<arguments.length){if(a[c]()!==b)a[c](b);c=a}else c=a[c]();return c},getMCharsBeforeCount:function(a,
  8 +b){for(var e=0,f=0,d=c.length;f<d&&f<a;f++)g.translation[c.charAt(f)]||(a=b?a+1:a,e++);return e},caretPos:function(a,b,d,f){return g.translation[c.charAt(Math.min(a-1,c.length-1))]?Math.min(a+d-b-f,d):e.caretPos(a+1,b,d,f)},behaviour:function(a){a=a||window.event;e.invalid=[];var c=a.keyCode||a.which;if(-1===b.inArray(c,g.byPassKeys)){var d=e.getCaret(),f=e.val().length,n=d<f,h=e.getMasked(),k=h.length,m=e.getMCharsBeforeCount(k-1)-e.getMCharsBeforeCount(f-1);e.val(h);!n||65===c&&a.ctrlKey||(8!==
  9 +c&&46!==c&&(d=e.caretPos(d,f,k,m)),e.setCaret(d));return e.callbacks(a)}},getMasked:function(a){var b=[],k=e.val(),f=0,n=c.length,h=0,l=k.length,m=1,p="push",u=-1,t,w;d.reverse?(p="unshift",m=-1,t=0,f=n-1,h=l-1,w=function(){return-1<f&&-1<h}):(t=n-1,w=function(){return f<n&&h<l});for(;w();){var x=c.charAt(f),v=k.charAt(h),r=g.translation[x];if(r)v.match(r.pattern)?(b[p](v),r.recursive&&(-1===u?u=f:f===t&&(f=u-m),t===u&&(f-=m)),f+=m):r.optional?(f+=m,h-=m):r.fallback?(b[p](r.fallback),f+=m,h-=m):e.invalid.push({p:h,
  10 +v:v,e:r.pattern}),h+=m;else{if(!a)b[p](x);v===x&&(h+=m);f+=m}}a=c.charAt(t);n!==l+1||g.translation[a]||b.push(a);return b.join("")},callbacks:function(b){var g=e.val(),l=g!==k,f=[g,b,a,d],n=function(a,b,c){"function"===typeof d[a]&&b&&d[a].apply(this,c)};n("onChange",!0===l,f);n("onKeyPress",!0===l,f);n("onComplete",g.length===c.length,f);n("onInvalid",0<e.invalid.length,[g,b,a,e.invalid,d])}};g.mask=c;g.options=d;g.remove=function(){var b=e.getCaret();e.destroyEvents();e.val(g.getCleanVal());e.setCaret(b-
  11 +e.getMCharsBeforeCount(b));return a};g.getCleanVal=function(){return e.getMasked(!0)};g.init=function(c){c=c||!1;d=d||{};g.byPassKeys=b.jMaskGlobals.byPassKeys;g.translation=b.jMaskGlobals.translation;g.translation=b.extend({},g.translation,d.translation);g=b.extend(!0,{},g,d);l=e.getRegexMask();!1===c?(d.placeholder&&a.attr("placeholder",d.placeholder),b("input").length&&!1==="oninput"in b("input")[0]&&"on"===a.attr("autocomplete")&&a.attr("autocomplete","off"),e.destroyEvents(),e.events(),c=e.getCaret(),
  12 +e.val(e.getMasked()),e.setCaret(c+e.getMCharsBeforeCount(c,!0))):(e.events(),e.val(e.getMasked()))};g.init(!a.is("input"))};b.maskWatchers={};var A=function(){var a=b(this),c={},d=a.attr("data-mask");a.attr("data-mask-reverse")&&(c.reverse=!0);a.attr("data-mask-clearifnotmatch")&&(c.clearIfNotMatch=!0);"true"===a.attr("data-mask-selectonfocus")&&(c.selectOnFocus=!0);if(z(a,d,c))return a.data("mask",new y(this,d,c))},z=function(a,c,d){d=d||{};var g=b(a).data("mask"),k=JSON.stringify;a=b(a).val()||
  13 +b(a).text();try{return"function"===typeof c&&(c=c(a)),"object"!==typeof g||k(g.options)!==k(d)||g.mask!==c}catch(l){}};b.fn.mask=function(a,c){c=c||{};var d=this.selector,g=b.jMaskGlobals,k=b.jMaskGlobals.watchInterval,l=function(){if(z(this,a,c))return b(this).data("mask",new y(this,a,c))};b(this).each(l);d&&""!==d&&g.watchInputs&&(clearInterval(b.maskWatchers[d]),b.maskWatchers[d]=setInterval(function(){b(document).find(d).each(l)},k));return this};b.fn.unmask=function(){clearInterval(b.maskWatchers[this.selector]);
  14 +delete b.maskWatchers[this.selector];return this.each(function(){var a=b(this).data("mask");a&&a.remove().removeData("mask")})};b.fn.cleanVal=function(){return this.data("mask").getCleanVal()};b.applyDataMask=function(a){a=a||b.jMaskGlobals.maskElements;(a instanceof b?a:b(a)).filter(b.jMaskGlobals.dataMaskAttr).each(A)};var p={maskElements:"input,td,span,div",dataMaskAttr:"*[data-mask]",dataMask:!0,watchInterval:300,watchInputs:!0,watchDataMask:!1,byPassKeys:[9,16,17,18,36,37,38,39,40,91],translation:{0:{pattern:/\d/},
  15 +9:{pattern:/\d/,optional:!0},"#":{pattern:/\d/,recursive:!0},A:{pattern:/[a-zA-Z0-9]/},S:{pattern:/[a-zA-Z]/}}};b.jMaskGlobals=b.jMaskGlobals||{};p=b.jMaskGlobals=b.extend(!0,{},p,b.jMaskGlobals);p.dataMask&&b.applyDataMask();setInterval(function(){b.jMaskGlobals.watchDataMask&&b.applyDataMask()},p.watchInterval)});
  16 +
src/noosfero-spb/software_communities/public/views/comments-software-extra-fields.js
@@ -15,6 +15,24 @@ modulejs.define(&#39;CommentsSoftwareExtraFields&#39;, [&#39;jquery&#39;], function($) { @@ -15,6 +15,24 @@ modulejs.define(&#39;CommentsSoftwareExtraFields&#39;, [&#39;jquery&#39;], function($) {
15 $(".comments-software-extra-fields div").hide(); 15 $(".comments-software-extra-fields div").hide();
16 } 16 }
17 }); 17 });
  18 + var organization_rating_saved_value = $("#organization_rating_saved_value");
  19 + var organization_rating_people_benefited = $("#organization_rating_people_benefited");
  20 + var people_benefited_tmp = $("#people_benefited_tmp");
  21 + var saved_value_tmp = $("#saved_value_tmp");
  22 +
  23 + saved_value_tmp.mask("#.##0,00", {reverse: true});
  24 + people_benefited_tmp.mask("000.000.000", {reverse: true});
  25 +
  26 + organization_rating_saved_value.closest("form").submit(function( event ) {
  27 + var unformated_saved_value = saved_value_tmp.val();
  28 + unformated_saved_value = unformated_saved_value.split(".").join("");
  29 + unformated_saved_value = unformated_saved_value.replace(",",".");
  30 + organization_rating_saved_value.val(unformated_saved_value);
  31 +
  32 + var unformated_people_benefited = people_benefited_tmp.val();
  33 + unformated_people_benefited = unformated_people_benefited.split(".").join("");
  34 + organization_rating_people_benefited.val(unformated_people_benefited);
  35 + });
18 } 36 }
19 37
20 return { 38 return {
src/noosfero-spb/software_communities/test/functional/software_communities_plugin_myprofile_controller_test.rb
1 -require File.dirname(__FILE__) + '/../../../../test/test_helper'  
2 -require File.dirname(__FILE__) + '/../helpers/software_test_helper'  
3 -require(  
4 - File.dirname(__FILE__) +  
5 - '/../../controllers/software_communities_plugin_myprofile_controller' 1 +require 'test_helper'
  2 +require_relative '../helpers/software_test_helper'
  3 +require_relative(
  4 + '../../controllers/software_communities_plugin_myprofile_controller'
6 ) 5 )
7 6
8 class SoftwareCommunitiesPluginMyprofileController; def rescue_action(e) raise e end; 7 class SoftwareCommunitiesPluginMyprofileController; def rescue_action(e) raise e end;
@@ -93,7 +92,11 @@ class SoftwareCommunitiesPluginMyprofileControllerTest &lt; ActionController::TestC @@ -93,7 +92,11 @@ class SoftwareCommunitiesPluginMyprofileControllerTest &lt; ActionController::TestC
93 assert_equal SoftwareInfo.last.acronym, "test" 92 assert_equal SoftwareInfo.last.acronym, "test"
94 end 93 end
95 94
96 - should 'upgrade a generic software to a public software' do 95 + should 'only admin upgrade a generic software to a public software' do
  96 + admin_person = create_user('admin').person
  97 + @environment.add_admin(admin_person)
  98 +
  99 + login_as(admin_person.user_login)
97 fields_software = software_fields 100 fields_software = software_fields
98 fields = software_edit_specific_fields 101 fields = software_edit_specific_fields
99 102
@@ -103,15 +106,69 @@ class SoftwareCommunitiesPluginMyprofileControllerTest &lt; ActionController::TestC @@ -103,15 +106,69 @@ class SoftwareCommunitiesPluginMyprofileControllerTest &lt; ActionController::TestC
103 post( 106 post(
104 :edit_software, 107 :edit_software,
105 :profile => software.community.identifier, 108 :profile => software.community.identifier,
106 - :library => fields[0],  
107 - :language => fields[1],  
108 - :database => fields[2],  
109 :operating_system => fields[3], 109 :operating_system => fields[3],
110 :software => fields[4], 110 :software => fields[4],
111 - :license => fields[5]  
112 ) 111 )
113 112
114 - assert_equal true, SoftwareInfo.last.public_software? 113 + assert SoftwareInfo.last.public_software?
  114 + end
  115 +
  116 + should 'not upgrade a generic software to a public software if user is not an admin' do
  117 + fields_software = software_fields
  118 + fields = software_edit_specific_fields
  119 +
  120 + fields[4]['public_software'] = true
  121 + software = create_software fields_software
  122 +
  123 + post(
  124 + :edit_software,
  125 + :profile => software.community.identifier,
  126 + :software => fields[4]
  127 + )
  128 +
  129 + refute SoftwareInfo.last.public_software?
  130 + end
  131 +
  132 + ["e_ping","e_mag","icp_brasil","e_arq","intern"].map do |attr|
  133 + define_method "test_should_#{attr}_not_be_changed_by_not_admin" do
  134 + fields_software = software_fields
  135 + fields = software_edit_specific_fields
  136 +
  137 + fields[4][attr]=true
  138 +
  139 + software = create_software fields_software
  140 +
  141 + post(
  142 + :edit_software,
  143 + :profile => software.community.identifier,
  144 + :software => fields[4]
  145 + )
  146 +
  147 + refute SoftwareInfo.last.send(attr)
  148 + end
  149 + end
  150 +
  151 + ["e_ping","e_mag","icp_brasil","e_arq","intern"].map do |attr|
  152 + define_method "test_should_#{attr}_be_changed_by_admin" do
  153 + admin_person = create_user('admin').person
  154 + @environment.add_admin(admin_person)
  155 + login_as(admin_person.user_login)
  156 +
  157 + fields_software = software_fields
  158 + fields = software_edit_specific_fields
  159 +
  160 + fields[4][attr]=true
  161 +
  162 + software = create_software fields_software
  163 +
  164 + post(
  165 + :edit_software,
  166 + :profile => software.community.identifier,
  167 + :software => fields[4]
  168 + )
  169 +
  170 + assert SoftwareInfo.last.send(attr)
  171 + end
115 end 172 end
116 173
117 should "create software_info with existing license_info" do 174 should "create software_info with existing license_info" do
@@ -146,9 +203,100 @@ class SoftwareCommunitiesPluginMyprofileControllerTest &lt; ActionController::TestC @@ -146,9 +203,100 @@ class SoftwareCommunitiesPluginMyprofileControllerTest &lt; ActionController::TestC
146 :profile => @person.identifier 203 :profile => @person.identifier
147 ) 204 )
148 205
149 - assert_equal SoftwareInfo.last.license_info_id, license_another.id  
150 - assert_equal SoftwareInfo.last.license_info.id, nil  
151 - assert_equal SoftwareInfo.last.license_info.version, another_license_version  
152 - assert_equal SoftwareInfo.last.license_info.link, another_license_link 206 + assert_equal license_another.id, SoftwareInfo.last.license_info_id
  207 + assert_equal nil, SoftwareInfo.last.license_info.id
  208 + assert_equal another_license_version, SoftwareInfo.last.license_info.version
  209 + assert_equal another_license_link, SoftwareInfo.last.license_info.link
  210 + end
  211 +
  212 + should "create software_info after finish task with 'Another' license_info" do
  213 + license_another = LicenseInfo.create(:version => "Another", :link => "#")
  214 +
  215 + another_license_version = "Different License"
  216 + another_license_link = "http://diferent.link"
  217 +
  218 + post(
  219 + :new_software,
  220 + :community => { :name => "New Software", :identifier => "new-software" },
  221 + :software_info => { :finality => "something", :repository_link => "" },
  222 + :license => { :license_infos_id => license_another.id,
  223 + :version => another_license_version,
  224 + :link=> another_license_link
  225 + },
  226 + :profile => @person.identifier
  227 + )
  228 +
  229 + @environment.add_admin(@person)
  230 + Task.last.send('finish', @person)
  231 +
  232 + assert_equal license_another.id, SoftwareInfo.last.license_info_id
  233 + assert_equal nil, SoftwareInfo.last.license_info.id
  234 + assert_equal another_license_version, SoftwareInfo.last.license_info.version
  235 + assert_equal another_license_link, SoftwareInfo.last.license_info.link
  236 + end
  237 +
  238 + should "show error messages on create software_info" do
  239 + post(
  240 + :new_software,
  241 + :community => {},
  242 + :software_info => {},
  243 + :license => {},
  244 + :profile => @person.identifier
  245 + )
  246 + assert_includes @response.body, "Domain can't be blank"
  247 + assert_includes @response.body, "Name can't be blank"
  248 + assert_includes @response.body, "Finality can't be blank"
  249 + assert_includes @response.body, "Version can't be blank"
153 end 250 end
  251 +
  252 + should "show domain not available error" do
  253 + @environment.add_admin(@person)
  254 +
  255 + post(
  256 + :new_software,
  257 + :community => {:name =>"New Software", :identifier => "new-software"},
  258 + :software_info => {:finality => "something", :repository_link => ""},
  259 + :license =>{:license_infos_id => LicenseInfo.last.id},
  260 + :profile => @person.identifier
  261 + )
  262 + post(
  263 + :new_software,
  264 + :community => {:name =>"New Software", :identifier => "new-software"},
  265 + :software_info => {:finality => "something", :repository_link => ""},
  266 + :license =>{:license_infos_id => LicenseInfo.last.id},
  267 + :profile => @person.identifier
  268 + )
  269 +
  270 + assert_includes @response.body, "Domain is not available"
  271 + end
  272 +
  273 + should "create software with admin moderation" do
  274 + @environment.enable('admin_must_approve_new_communities')
  275 +
  276 + post(
  277 + :new_software,
  278 + :community => {:name =>"New Software", :identifier => "new-software"},
  279 + :software_info => {:finality => "something", :repository_link => ""},
  280 + :license =>{:license_infos_id => LicenseInfo.last.id},
  281 + :profile => @person.identifier
  282 + )
  283 +
  284 + @environment.add_admin(@person)
  285 + Task.last.send('finish', @person)
  286 +
  287 + assert_equal "New Software", Task.last.data[:name]
  288 + assert_equal "New Software", SoftwareInfo.last.community.name
  289 + end
  290 +
  291 + should "dont create software without accept task" do
  292 + assert_no_difference 'SoftwareInfo.count' do
  293 + post(
  294 + :new_software,
  295 + :community => {:name =>"New Software", :identifier => "new-software"},
  296 + :software_info => {:finality => "something", :repository_link => ""},
  297 + :license =>{:license_infos_id => LicenseInfo.last.id},
  298 + :profile => @person.identifier
  299 + )
  300 + end
  301 + end
154 end 302 end
src/noosfero-spb/software_communities/test/unit/api_test.rb 0 → 100644
@@ -0,0 +1,31 @@ @@ -0,0 +1,31 @@
  1 +require File.dirname(__FILE__) + '/../../../../test/unit/api/test_helper'
  2 +require File.dirname(__FILE__) + '/../helpers/plugin_test_helper'
  3 +
  4 +class SoftwareCommunitiesApiTest < ActiveSupport::TestCase
  5 +
  6 + include PluginTestHelper
  7 +
  8 + def setup
  9 + login_api
  10 + environment = Environment.default
  11 + environment.enable_plugin(SoftwareCommunitiesPlugin)
  12 + end
  13 +
  14 + should 'list all softwares' do
  15 + @software_info = create_software_info("software_test")
  16 + @software_info2 = create_software_info("software_test2")
  17 +
  18 + get "/api/v1/software_communities?#{params.to_query}"
  19 + json = JSON.parse(last_response.body)
  20 + assert_equivalent [@software_info.id, @software_info2.id], json['software_infos'].map {|c| c['id']}
  21 + end
  22 +
  23 + should 'get software by id' do
  24 + @software_info = create_software_info("software_test")
  25 + get "/api/v1/software_communities/#{@software_info.id}?#{params.to_query}"
  26 +
  27 + json = JSON.parse(last_response.body)
  28 + assert_equal @software_info.id, json["software_info"]["id"]
  29 + end
  30 +
  31 +end
src/noosfero-spb/software_communities/test/unit/software_events_block_test.rb 0 → 100644
@@ -0,0 +1,63 @@ @@ -0,0 +1,63 @@
  1 +require File.dirname(__FILE__) + '/../../../../test/test_helper'
  2 +require File.dirname(__FILE__) + '/../helpers/plugin_test_helper'
  3 +
  4 +class SoftwareEventsBlockTest < ActiveSupport::TestCase
  5 + include PluginTestHelper
  6 +
  7 + def setup
  8 + @community = create_community("A new community")
  9 + @software_events_block = SoftwareEventsBlock.new
  10 +
  11 + box = Box.new
  12 + box.position = 1
  13 + box.owner = @community
  14 + box.blocks << @software_events_block
  15 + box.save!
  16 +
  17 + @e1 = Event.new :name=>"Event 1", :body=>"Event 1 body",
  18 + :start_date=>DateTime.now, :end_date=>(DateTime.now + 1.month)
  19 +
  20 + @e2 = Event.new :name=>"Event 2", :body=>"Event 2 body",
  21 + :start_date=>(DateTime.now - 10.days), :end_date=>(DateTime.now + 10.days)
  22 +
  23 + @e3 = Event.new :name=>"Event 3", :body=>"Event 3 body",
  24 + :start_date=>(DateTime.now - 20.days), :end_date=>(DateTime.now - 10.days)
  25 +
  26 + @community.events << @e1
  27 + @community.events << @e2
  28 + @community.events << @e3
  29 + @community.save!
  30 + end
  31 +
  32 + should "give community events that have not yet finished ordered by start date" do
  33 + events = @software_events_block.get_events
  34 +
  35 + assert_equal false, events.include?(@e3)
  36 + assert_equal @e2, events.first
  37 + assert_equal @e1, events.last
  38 + end
  39 +
  40 + should "give community events except by a event with a given slug" do
  41 + events = @software_events_block.get_events_except(@e1.slug)
  42 +
  43 + assert_equal false, events.include?(@e1)
  44 + end
  45 +
  46 + should "tell if there are events to be displayed" do
  47 + assert_equal true, @software_events_block.has_events_to_display?
  48 +
  49 + @community.events.update_all :start_date => (DateTime.now - 2.days),
  50 + :end_date => (DateTime.now - 1.day)
  51 +
  52 + assert_equal false, @software_events_block.has_events_to_display?
  53 + end
  54 +
  55 + should "tell that the block must show the title in other areas that are no the main area" do
  56 + assert_equal false, @software_events_block.should_display_title?
  57 +
  58 + @software_events_block.box.position = 3
  59 + @software_events_block.save!
  60 +
  61 + assert_equal true, @software_events_block.should_display_title?
  62 + end
  63 +end
src/noosfero-spb/software_communities/test/unit/software_info_validation_test.rb
@@ -49,6 +49,7 @@ class SoftwareInfoValidationTest &lt; ActiveSupport::TestCase @@ -49,6 +49,7 @@ class SoftwareInfoValidationTest &lt; ActiveSupport::TestCase
49 49
50 @software_info.features = "Do a lot of things" 50 @software_info.features = "Do a lot of things"
51 @software_info.objectives = "All tests should pass !" 51 @software_info.objectives = "All tests should pass !"
  52 + @software_info.community = @community
52 end 53 end
53 54
54 def teardown 55 def teardown
src/noosfero-spb/software_communities/views/_main_software_editor_extras.html.erb
@@ -1,32 +0,0 @@ @@ -1,32 +0,0 @@
1 -<h2><%= _('Software Information') %></h2>  
2 -  
3 -<%= label_tag("name", _('Name'), {:class => 'formlabel'}) %>  
4 -  
5 -<div id='software-name-field' class='formfield'>  
6 - <span id='software-hostname'><%= context.profile.environment.default_hostname %>/</span>  
7 - <%= text_field_tag(:name, context.profile.software_info.community.name) %>  
8 -</div>  
9 -  
10 -<h3> <%= _("Finality") %> </h3>  
11 -<div id="finality">  
12 - <%= text_field_tag(:finality, context.profile.software_info.finality) %>  
13 -</div>  
14 -  
15 -<h3> <%= _("Licenses") %> </h3>  
16 -<div id='licenses'>  
17 - <%= select_tag(:id, options_for_select(LicenseHelper.getListLicenses.collect{|l| [l.version, l.id]}, :selected => context.profile.software_info.license_info.id), :onchange => "get_license_link('version')") %>  
18 - <br />  
19 -  
20 - <h4> <%= _("License link") %> </h4>  
21 - <% LicenseHelper.getListLicenses.each do | license | %>  
22 - <input type="hidden" id = "version_<%=license.id %>" value = "<%=license.link%>">  
23 - <% end %>  
24 -  
25 - <a id = "version_link" href="<%= context.profile.software_info.license_info.link %>" target="BLANK"> <%= context.profile.software_info.license_info.link %> </a>  
26 -</div>  
27 -  
28 -<div class="formfieldline formfield type-text">  
29 - <%= label_tag "repository_url", _("Link to Repository: ") %>  
30 - <%= text_field_tag(:reository_url) %>  
31 -</div>  
32 -  
src/noosfero-spb/software_communities/views/blocks/_software_events_list_item.html.erb 0 → 100644
@@ -0,0 +1,9 @@ @@ -0,0 +1,9 @@
  1 +<div class="software-events-list-item-calendar"></div>
  2 +
  3 +<span class="software-events-list-item-date">
  4 + <%= event.start_date.strftime "%d/%m - " %>
  5 +</span>
  6 +
  7 +<span class="software-events-list-item-title">
  8 + <%= link_to event.title, event.url %>
  9 +</span>
src/noosfero-spb/software_communities/views/blocks/software_events.html.erb 0 → 100644
@@ -0,0 +1,22 @@ @@ -0,0 +1,22 @@
  1 +<div class="software-community-events-block">
  2 + <% if block.has_events_to_display? %>
  3 + <ul class="software-community-events-list">
  4 +
  5 + <% if block.should_display_title? %>
  6 + <li class="software-events-list-item">
  7 + <span class="software-events-list-item-title">
  8 + <%= block.title %>
  9 + </span>
  10 + </li>
  11 + <% end %>
  12 +
  13 + <% block.get_events_except(params[:page]).each do |event| %>
  14 + <li class="software-events-list-item">
  15 + <%= render :partial=>"blocks/software_events_list_item",
  16 + :locals => {:event => event} %>
  17 + </li>
  18 + <% end %>
  19 +
  20 + </ul>
  21 + <% end %>
  22 +</div>
src/noosfero-spb/software_communities/views/comments_extra_fields.html.erb
@@ -7,7 +7,6 @@ @@ -7,7 +7,6 @@
7 </div> 7 </div>
8 8
9 <div class="comments-software-extra-fields"> 9 <div class="comments-software-extra-fields">
10 -  
11 <div class="extra-fields-container"> 10 <div class="extra-fields-container">
12 <div class="comments-software-people-benefited"> 11 <div class="comments-software-people-benefited">
13 <%= label_tag "comments_people_benefited", _("Number of Beneficiaries")%> 12 <%= label_tag "comments_people_benefited", _("Number of Beneficiaries")%>
src/noosfero-spb/software_communities/views/organization_ratings_extra_fields_show_data.html.erb
1 <div class="aditional-informations"> 1 <div class="aditional-informations">
2 <div class="comments-people-benefited"> 2 <div class="comments-people-benefited">
3 - <span><%=_("Benefited People")%> :</span> <%= user_rating.people_benefited unless user_rating.nil? %> 3 + <span><%=_("Benefited People")%>:</span> <%= number_with_delimiter(user_rating.people_benefited, :separator => environment.currency_separator, :delimiter => environment.currency_delimiter) unless user_rating.nil? %>
4 </div> 4 </div>
5 5
6 <div class="comments-saved-value"> 6 <div class="comments-saved-value">
7 - <span><%=_("Saved Resources")%> :</span> <%= user_rating.saved_value unless user_rating.nil? %> 7 + <span><%=_("Saved Resources")%>:</span> <%= float_to_currency(user_rating.saved_value) unless user_rating.nil? %>
8 </div> 8 </div>
9 </div> 9 </div>
10 10
src/noosfero-spb/software_communities/views/search/_full_community.html.erb
1 <% software = community.software_info %> 1 <% software = community.software_info %>
2 <li class="search-software-item"> 2 <li class="search-software-item">
  3 + <% organization_average_rating = '' %>
  4 + <% unless community.organization_ratings.empty?%>
  5 + <% organization_average_rating = render :partial => 'shared/organization_average_rating_block', :locals => {:community => community}%>
  6 + <% end %>
  7 +
  8 + <% software_publish_date = render :partial => 'shared/software_publish_date', :locals => {:community => community, :order => @order} %>
  9 +
3 <div class="search-software-item-column-left"> 10 <div class="search-software-item-column-left">
4 - <%= profile_image_link community, :portrait, 'div', community.send(@order + '_label') + show_date(community.created_at) %> 11 + <%= profile_image_link community, :portrait, 'div', organization_average_rating + software_publish_date %>
5 </div> 12 </div>
6 13
7 <div class="search-software-item-column-right"> 14 <div class="search-software-item-column-right">
src/noosfero-spb/software_communities/views/search/_software_search_form.html.erb
@@ -51,7 +51,8 @@ @@ -51,7 +51,8 @@
51 [ 51 [
52 [_("Name A-Z"), 'asc'], 52 [_("Name A-Z"), 'asc'],
53 [_("Name Z-A"), 'desc'], 53 [_("Name Z-A"), 'desc'],
54 - [_("Relevance"), 'relevance'] 54 + [_("Relevance"), 'relevance'],
  55 + [_("Favorites"), 'rating']
55 ], :selected=>params[:sort]) 56 ], :selected=>params[:sort])
56 ) %> 57 ) %>
57 </div> 58 </div>
src/noosfero-spb/software_communities/views/shared/_organization_average_rating_block.html.erb 0 → 100644
@@ -0,0 +1,9 @@ @@ -0,0 +1,9 @@
  1 +<div class="star-container catalog_rating_block">
  2 + <% (1..5).each do |rate_number| %>
  3 + <% if rate_number <= OrganizationRating.average_rating(community.id) %>
  4 + <div class="medium-star-positive"></div>
  5 + <% else %>
  6 + <div class="medium-star-negative"></div>
  7 + <% end %>
  8 + <% end %>
  9 +</div>
src/noosfero-spb/software_communities/views/shared/_software_publish_date.html.erb 0 → 100644
@@ -0,0 +1,5 @@ @@ -0,0 +1,5 @@
  1 +<span class="software-date">
  2 + <div class="software-date-label"><%= community.send(order + '_label') %></div>
  3 + <div class="software-date-value"><%= show_date(community.created_at) %></div>
  4 +</span>
  5 +
src/noosfero-spb/software_communities/views/software_communities_plugin_myprofile/_license_info_fields.html.erb
1 -<% LicenseHelper.getListLicenses.each do | license | %>  
2 - <input type="hidden" id = "version_<%=license.id %>" value = "<%=license.link%>">  
3 -<% end %>  
4 -  
5 <%= text_field_tag "license_info[version]", license_version, :id=>"license_info_version", :class=>"license_info_version", :placeholder=>_('Autocomplete field, type some license') %> 1 <%= text_field_tag "license_info[version]", license_version, :id=>"license_info_version", :class=>"license_info_version", :placeholder=>_('Autocomplete field, type some license') %>
6 <%= hidden_field_tag "license[license_infos_id]", license_id, :id=>"license_info_id", :class=>"license_info_id", :data => {:label=>license_version} %> 2 <%= hidden_field_tag "license[license_infos_id]", license_id, :id=>"license_info_id", :class=>"license_info_id", :data => {:label=>license_version} %>
7 3
src/noosfero-spb/software_communities/views/software_communities_plugin_myprofile/_main_software_editor_extras.html.erb
@@ -5,7 +5,7 @@ @@ -5,7 +5,7 @@
5 </div> 5 </div>
6 6
7 <div class= <%= @error_software_acronym %> > 7 <div class= <%= @error_software_acronym %> >
8 - <%= label_tag("software[acronym]", _('Short Name'), {:class => 'formlabel mandatory'}) %> 8 + <%= label_tag("software[acronym]", _('Short Name'), {:class => 'formlabel'}) %>
9 <%= text_field_tag("software[acronym]", @profile.software_info.acronym, :id => 'software_acronym_id', :maxlength=>"10") %> 9 <%= text_field_tag("software[acronym]", @profile.software_info.acronym, :id => 'software_acronym_id', :maxlength=>"10") %>
10 </div> 10 </div>
11 11
src/noosfero-spb/software_communities/views/software_communities_plugin_myprofile/_public_software_info.html.erb
1 <div id = "public_software"> 1 <div id = "public_software">
2 - <% if @disabled_public_software_field == true %>  
3 - <%= check_box_tag("software[public_software]", "true", @software_info.public_software?, :disabled => "disabled") %>  
4 - <%= label_tag _("Public Software"), _("Public software"), :class => "public_software_disabled" %>  
5 - <% else %>  
6 - <%= check_box_tag("software[public_software]", "true", @software_info.public_software?) %>  
7 - <%= label_tag _("Public Software"), _("Public software"), :class => "public_software_enabled" %>  
8 - <% end %> 2 + <%= check_box_tag("software[public_software]", "true", @software_info.public_software?, :disabled => @non_admin_status) %>
  3 + <%= label_tag _("Public Software"), _("Public software") %>
9 <div class="public-software-fields"> 4 <div class="public-software-fields">
10 <h4> <%= _("Public Software") %> </h4> 5 <h4> <%= _("Public Software") %> </h4>
11 <div class="formfieldline"> 6 <div class="formfieldline">
12 <%= label_tag _("Adherent to e-PING ?") %> 7 <%= label_tag _("Adherent to e-PING ?") %>
13 8
14 <%= label_tag "e_ping_true", "Yes" %> 9 <%= label_tag "e_ping_true", "Yes" %>
15 - <%= radio_button_tag("software[e_ping]", true, @software_info.e_ping)%> 10 + <%= radio_button_tag("software[e_ping]", true, @software_info.e_ping, :disabled => @non_admin_status) %>
16 <%= label_tag "e_ping_false", "No"%> 11 <%= label_tag "e_ping_false", "No"%>
17 - <%= radio_button_tag("software[e_ping]", false, !@software_info.e_ping)%> 12 + <%= radio_button_tag("software[e_ping]", false, !@software_info.e_ping, :disabled => @non_admin_status) %>
18 </div> 13 </div>
19 14
20 <div class="formfieldline"> 15 <div class="formfieldline">
21 <%= label_tag _("Adherent to e-MAG ?") %> 16 <%= label_tag _("Adherent to e-MAG ?") %>
22 17
23 <%= label_tag "e_mag_true", "Yes"%> 18 <%= label_tag "e_mag_true", "Yes"%>
24 - <%= radio_button_tag("software[e_mag]", true, @software_info.e_mag)%> 19 + <%= radio_button_tag("software[e_mag]", true, @software_info.e_mag, :disabled => @non_admin_status) %>
25 <%= label_tag "e_mag_false", "No"%> 20 <%= label_tag "e_mag_false", "No"%>
26 - <%= radio_button_tag("software[e_mag]", false, !@software_info.e_mag)%> 21 + <%= radio_button_tag("software[e_mag]", false, !@software_info.e_mag, :disabled => @non_admin_status) %>
27 </div> 22 </div>
28 23
29 <div class="formfieldline"> 24 <div class="formfieldline">
30 <%= label_tag _("Adherent to ICP-Brasil ?") %> 25 <%= label_tag _("Adherent to ICP-Brasil ?") %>
31 26
32 <%= label_tag "icp_brasil_true", "Yes"%> 27 <%= label_tag "icp_brasil_true", "Yes"%>
33 - <%= radio_button_tag("software[icp_brasil]", true, @software_info.icp_brasil)%> 28 + <%= radio_button_tag("software[icp_brasil]", true, @software_info.icp_brasil, :disabled => @non_admin_status) %>
34 <%= label_tag "icp_brasil_false", "No"%> 29 <%= label_tag "icp_brasil_false", "No"%>
35 - <%= radio_button_tag("software[icp_brasil]", false, !@software_info.icp_brasil)%> 30 + <%= radio_button_tag("software[icp_brasil]", false, !@software_info.icp_brasil, :disabled => @non_admin_status) %>
36 </div> 31 </div>
37 32
38 <div class="formfieldline"> 33 <div class="formfieldline">
39 <%= label_tag _("Adherent to e-ARQ ?") %> 34 <%= label_tag _("Adherent to e-ARQ ?") %>
40 35
41 <%= label_tag "e_arq_true", "Yes"%> 36 <%= label_tag "e_arq_true", "Yes"%>
42 - <%= radio_button_tag("software[e_arq]", true, @software_info.e_arq)%> 37 + <%= radio_button_tag("software[e_arq]", true, @software_info.e_arq, :disabled => @non_admin_status) %>
43 <%= label_tag "e_arq_false", "No"%> 38 <%= label_tag "e_arq_false", "No"%>
44 - <%= radio_button_tag("software[e_arq]", false, !@software_info.e_arq)%> 39 + <%= radio_button_tag("software[e_arq]", false, !@software_info.e_arq, :disabled => @non_admin_status) %>
45 </div> 40 </div>
46 41
47 <div class="formfieldline"> 42 <div class="formfieldline">
48 <%= label_tag _("Internacionalizable ?") %> 43 <%= label_tag _("Internacionalizable ?") %>
49 44
50 <%= label_tag "intern_true", "Yes" %> 45 <%= label_tag "intern_true", "Yes" %>
51 - <%= radio_button_tag("software[intern]", true, @software_info.intern)%> 46 + <%= radio_button_tag("software[intern]", true, @software_info.intern, :disabled => @non_admin_status) %>
52 <%= label_tag "intern_false", "No"%> 47 <%= label_tag "intern_false", "No"%>
53 - <%= radio_button_tag("software[intern]", false, !@software_info.intern)%> 48 + <%= radio_button_tag("software[intern]", false, !@software_info.intern, :disabled => @non_admin_status) %>
54 </div> 49 </div>
55 </div> 50 </div>
56 </div> 51 </div>
src/noosfero-spb/spb_migrations/db/migrate/20151106172419_remove_softwares_without_community.rb 0 → 100644
@@ -0,0 +1,9 @@ @@ -0,0 +1,9 @@
  1 +class RemoveSoftwaresWithoutCommunity < ActiveRecord::Migration
  2 + def up
  3 + execute('DELETE FROM software_infos where community_id NOT IN (SELECT id FROM profiles)')
  4 + end
  5 +
  6 + def down
  7 + say "This migration can't be reverted!"
  8 + end
  9 +end
src/pkg-rpm/.gitignore
1 /.obs 1 /.obs
2 /.config.mk 2 /.config.mk
  3 +*/*.tar.*
  4 +/.virtualenv
src/pkg-rpm/Makefile
1 OBSPROJECT = isv:spb:devel 1 OBSPROJECT = isv:spb:devel
2 COPR_PROJECT = softwarepublico/v5 2 COPR_PROJECT = softwarepublico/v5
3 -LOCAL_BUILD_DIR = $(PWD)/build 3 +LOCAL_BUILD_DIR = $(CURDIR)/build
4 4
5 # Vagrant environment does not accept links from/to shared folder 5 # Vagrant environment does not accept links from/to shared folder
6 -ifeq "$(PWD)" "/vagrant" 6 +ifeq "/vagrant" "$(shell ls -1d /vagrant 2>/dev/null)"
7 LOCAL_BUILD_DIR = /home/vagrant/rpmbuild 7 LOCAL_BUILD_DIR = /home/vagrant/rpmbuild
8 endif 8 endif
9 9
@@ -57,7 +57,7 @@ checkout_packages_obs = $(patsubst %, %-checkout-obs, $(packages)) @@ -57,7 +57,7 @@ checkout_packages_obs = $(patsubst %, %-checkout-obs, $(packages))
57 upload_packages_obs = $(patsubst %, %-upload-obs, $(packages)) 57 upload_packages_obs = $(patsubst %, %-upload-obs, $(packages))
58 diff_packages_obs = $(patsubst %, %-diff-obs, $(packages)) 58 diff_packages_obs = $(patsubst %, %-diff-obs, $(packages))
59 59
60 -.PHONY: $(build_packages) $(checkout_packages_obs) $(upload_packages_obs) $(diff_packages_obs) 60 +.PHONY: $(build_packages) $(checkout_packages_obs) $(upload_packages_obs) $(diff_packages_obs) copr-cli
61 61
62 ### Targets 62 ### Targets
63 63
@@ -76,8 +76,14 @@ $(build_src_packages): %-build-src : % @@ -76,8 +76,14 @@ $(build_src_packages): %-build-src : %
76 rm -f $(LOCAL_BUILD_DIR)/SRPMS/$*-*.src.rpm 76 rm -f $(LOCAL_BUILD_DIR)/SRPMS/$*-*.src.rpm
77 cd $* && $(BUILD_PREFIX) rpmbuild --define "_topdir $(LOCAL_BUILD_DIR)" -bs $*.spec --nodeps 77 cd $* && $(BUILD_PREFIX) rpmbuild --define "_topdir $(LOCAL_BUILD_DIR)" -bs $*.spec --nodeps
78 78
79 -$(upload_packages): %-upload : %-build-src %  
80 - copr-cli build $(COPR_PROJECT) $(LOCAL_BUILD_DIR)/SRPMS/$*-*.src.rpm --nowait 79 +$(upload_packages): %-upload : %-build-src % copr-cli
  80 + .virtualenv/bin/copr-cli build $(COPR_PROJECT) $(LOCAL_BUILD_DIR)/SRPMS/$*-*.src.rpm --nowait
  81 +
  82 +copr-cli: .virtualenv/bin/copr-cli
  83 +
  84 +.virtualenv/bin/copr-cli:
  85 + virtualenv .virtualenv
  86 + .virtualenv/bin/pip install copr-cli
81 87
82 ### OBS targets (deprecated) 88 ### OBS targets (deprecated)
83 89
@@ -102,3 +108,8 @@ diff-obs: $(diff_packages_obs) @@ -102,3 +108,8 @@ diff-obs: $(diff_packages_obs)
102 108
103 status-obs st-obs: 109 status-obs st-obs:
104 @$(MAKE) diff | diffstat -C 110 @$(MAKE) diff | diffstat -C
  111 +
  112 +clean:
  113 + rm -rf */*.tar.*
  114 + rm -rf build/
  115 + rm -rf .virtualenv/
src/pkg-rpm/colab-deps/colab-deps.spec
1 Summary: Collaboration platform for communities (Python dependencies) 1 Summary: Collaboration platform for communities (Python dependencies)
2 Name: colab-deps 2 Name: colab-deps
3 -Version: 1.11.3  
4 -Release: 25.1 3 +Version: 1.11.6
  4 +Release: 1
5 Source0: colab-deps-%{version}.tar.gz 5 Source0: colab-deps-%{version}.tar.gz
6 License: Various 6 License: Various
7 Group: Development/Tools 7 Group: Development/Tools
src/pkg-rpm/colab-spb-plugin/colab-spb-plugin.spec 0 → 100644
@@ -0,0 +1,45 @@ @@ -0,0 +1,45 @@
  1 +Name: colab-spb-plugin
  2 +Version: 5.0a0
  3 +Release: 1
  4 +Summary: SPB-specific Colab plugin
  5 +License: GPL-3.0
  6 +Group: Applications/Publishing
  7 +Url: https://softwarepublico.gov.br/gitlab/softwarepublico/softwarepublico
  8 +Source0: %{name}-%{version}.tar.gz
  9 +Requires: colab >= 1.11
  10 +BuildArch: noarch
  11 +BuildRequires: colab, colab-deps >= 1.11.4, python-virtualenv
  12 +
  13 +%description
  14 +This package contains Colab plugin for the Software Público Brasileiro platform.
  15 +
  16 +%prep
  17 +%setup -q
  18 +
  19 +%build
  20 +# install colab and colab-des into virtualenv
  21 +rm -rf virtualenv
  22 +cp -r /usr/lib/colab virtualenv
  23 +PATH=$(pwd)/virtualenv/bin:$PATH pip install --use-wheel --no-index .
  24 +virtualenv --relocatable virtualenv
  25 +
  26 +rpm -ql colab-deps colab | sed '/^\/usr\/lib\/colab\// !d; s#/usr/lib/colab/##' > cleanup.list
  27 +while read f; do
  28 + if [ -f "virtualenv/$f" ]; then
  29 + rm -f "virtualenv/$f"
  30 + fi
  31 +done < cleanup.list
  32 +rm -f cleanup.list
  33 +find virtualenv -type d -empty -delete
  34 +rm -rf virtualenv/bin
  35 +rm -rf virtualenv/include
  36 +
  37 +%install
  38 +
  39 +install -d -m 0755 %{buildroot}/usr/lib
  40 +rm -rf %{buildroot}/usr/lib/colab
  41 +cp -r virtualenv %{buildroot}/usr/lib/colab
  42 +
  43 +%files
  44 +%defattr(-,root,root)
  45 +/usr/lib/colab
src/pkg-rpm/colab-spb-theme/colab-spb-theme.spec
1 1
2 Name: colab-spb-theme 2 Name: colab-spb-theme
3 -Version: 0.2.0 3 +Version: 5.0a0
4 Release: 9.1 4 Release: 9.1
5 Summary: SPB-specific Colab theme 5 Summary: SPB-specific Colab theme
6 License: GPL-3.0 6 License: GPL-3.0
src/pkg-rpm/colab/colab.spec
1 %define name colab 1 %define name colab
2 -%define version 1.11.3  
3 -%define default_release 0  
4 -%{!?release: %define release %{default_release}} 2 +%define version 1.11.4
5 %define buildvenv /var/tmp/%{name}-%{version} 3 %define buildvenv /var/tmp/%{name}-%{version}
6 4
7 Summary: Collaboration platform for communities 5 Summary: Collaboration platform for communities
8 Name: %{name} 6 Name: %{name}
9 Version: %{version} 7 Version: %{version}
10 -Release: 19 8 +Release: 1
11 Source0: %{name}-%{version}.tar.gz 9 Source0: %{name}-%{version}.tar.gz
12 License: GPLv2 10 License: GPLv2
13 Group: Development/Tools 11 Group: Development/Tools
@@ -16,9 +14,9 @@ Prefix: %{_prefix} @@ -16,9 +14,9 @@ Prefix: %{_prefix}
16 Vendor: Sergio Oliveira <sergio@tracy.com.br> 14 Vendor: Sergio Oliveira <sergio@tracy.com.br>
17 Url: https://github.com/colab/colab 15 Url: https://github.com/colab/colab
18 BuildArch: noarch 16 BuildArch: noarch
19 -BuildRequires: colab-deps >= 1.11.3, python-virtualenv 17 +BuildRequires: colab-deps >= 1.11.6, python-virtualenv
20 # FIXME colab should not depend on nginx! 18 # FIXME colab should not depend on nginx!
21 -Requires: colab-deps >= 1.11.3, solr, mailman-api >= 0.3rc3, nginx 19 +Requires: colab-deps >= 1.11.6, solr, mailman-api >= 0.3rc3, nginx
22 20
23 %description 21 %description
24 Integrated software development platform. 22 Integrated software development platform.
@@ -227,6 +225,10 @@ if [ $1 -gt 1 ]; then @@ -227,6 +225,10 @@ if [ $1 -gt 1 ]; then
227 systemctl try-restart colab 225 systemctl try-restart colab
228 fi 226 fi
229 227
  228 +colab-admin build_solr_schema > /var/tmp/schema.xml
  229 +mv -f /var/tmp/schema.xml /usr/share/solr/example/solr/collection1/conf/schema.xml
  230 +systemctl restart solr
  231 +
230 systemctl daemon-reload 232 systemctl daemon-reload
231 233
232 %preun 234 %preun
src/pkg-rpm/kalibro-configurations-deps/kalibro-configurations-deps.spec
1 Name: kalibro-configurations-deps 1 Name: kalibro-configurations-deps
2 Version: 1.0 2 Version: 1.0
  3 +Release: 0
3 Summary: Ruby dependencies for kalibro-configurations 4 Summary: Ruby dependencies for kalibro-configurations
4 Group: Development/Tools 5 Group: Development/Tools
5 License: Various 6 License: Various
src/pkg-rpm/prezento-spb-deps/prezento-spb-deps.spec
1 Name: prezento-spb-deps 1 Name: prezento-spb-deps
2 Version: 0.8.3.colab 2 Version: 0.8.3.colab
  3 +Release: 1
3 Summary: Ruby dependencies for prezento 4 Summary: Ruby dependencies for prezento
4 Group: Development/Tools 5 Group: Development/Tools
5 License: Various 6 License: Various
test/colab_test.sh
@@ -5,7 +5,7 @@ test_database_connectivity() { @@ -5,7 +5,7 @@ test_database_connectivity() {
5 } 5 }
6 6
7 test_colab_config_is_in_place() { 7 test_colab_config_is_in_place() {
8 - assertTrue 'colab settings.yml is in place' 'run_on integration test -f /etc/colab/settings.yaml' 8 + assertTrue 'colab settings.py is in place' 'run_on integration test -f /etc/colab/settings.py'
9 } 9 }
10 10
11 test_colab_running() { 11 test_colab_running() {