diff --git a/INSTALL.mdtext b/INSTALL.mdtext index 97a43d6..7827f25 100644 --- a/INSTALL.mdtext +++ b/INSTALL.mdtext @@ -4,6 +4,12 @@ The installation of InDefero is composed of 2 parts, first the installation of the [Pluf framework](http://www.pluf.org) and second, the installation of InDefero by itself. +## PHP modules for indefero + +Indefero need the GD module for PHP. It's named "php5-gd" in debian. + + $ apt-get install php5-gd + ## Recommended Layout of the Files If your server document root is in `/var/www` a good thing is to keep diff --git a/logo/no_logo.svg b/logo/no_logo.svg new file mode 100644 index 0000000..3149dd1 --- /dev/null +++ b/logo/no_logo.svg @@ -0,0 +1,173 @@ + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/IDF/Form/ProjectConf.php b/src/IDF/Form/ProjectConf.php new file mode 100644 index 0000000..0144cd1 --- /dev/null +++ b/src/IDF/Form/ProjectConf.php @@ -0,0 +1,140 @@ +project = $extra['project']; + + // Basic part + $this->fields['name'] = new Pluf_Form_Field_Varchar(array('required' => true, + 'label' => __('Name'), + 'initial' => $this->project->name, + )); + $this->fields['shortdesc'] = new Pluf_Form_Field_Varchar(array('required' => true, + 'label' => __('Short Description'), + 'initial' => $this->project->shortdesc, + 'widget_attrs' => array('size' => '68'), + )); + $this->fields['description'] = new Pluf_Form_Field_Varchar(array('required' => true, + 'label' => __('Description'), + 'initial' => $this->project->description, + 'widget_attrs' => array('cols' => 68, + 'rows' => 26, + ), + 'widget' => 'Pluf_Form_Widget_TextareaInput', + )); + + // Logo part + $upload_path = Pluf::f('upload_path', false); + if (false === $upload_path) { + throw new Pluf_Exception_SettingError(__('The "upload_path" configuration variable was not set.')); + } + $upload_path .= '/' . $this->project->shortname; + $filename = '/%s'; + $this->fields['logo'] = new Pluf_Form_Field_File(array('required' => false, + 'label' => __('Update the logo'), + 'initial' => '', + 'help_text' => __('The logo must be a picture with a size of 32 by 32.'), + 'max_size' => Pluf::f('max_upload_size', 5 * 1024), + 'move_function_params' => + array('upload_path' => $upload_path, + 'upload_path_create' => true, + 'file_name' => $filename, + ) + )); + + $this->fields['logo_remove'] = new Pluf_Form_Field_Boolean(array('required' => false, + 'label' => __('Remove the current logo'), + 'initial' => false, + 'widget' => 'Pluf_Form_Widget_CheckboxInput', + )); + } + + /** + * If we have uploaded a file, but the form failed remove it. + * + */ + function failed() + { + if (!empty($this->cleaned_data['logo']) + && file_exists(Pluf::f('upload_path').'/'.$this->cleaned_data['logo'])) { + unlink(Pluf::f('upload_path').'/'.$this->cleaned_data['logo']); + } + } + + public function clean() + { + if (!isset($this->cleaned_data['logo_remove'])) { + $this->cleaned_data['logo_remove'] = false; + } + + return $this->cleaned_data; + } + + public function clean_logo() + { + if (empty($this->cleaned_data['logo'])) { + return ''; + } + + $meta = getimagesize(Pluf::f('upload_path') . '/' . $this->project->shortname . $this->cleaned_data['logo']); + + if ($meta === false) { + throw new Pluf_Form_Invalid("Could not determine the size of the uploaded picture."); + } + + if ($meta[0] !== 32 || $meta[1] !== 32) { + throw new Pluf_Form_Invalid("The picture must have a size of 32 by 32."); + } + + return $this->cleaned_data['logo']; + } + + public function save($commit=true) + { + $conf = $this->project->getConf(); + + // Basic part + $this->project->name = $this->cleaned_data['name']; + $this->project->shortdesc = $this->cleaned_data['shortdesc']; + $this->project->description = $this->cleaned_data['description']; + $this->project->update(); + + // Logo part + if ($this->cleaned_data['logo'] !== "") { + $conf->setVal('logo', $this->cleaned_data['logo']); + } + if ($this->cleaned_data['logo_remove'] === true) { + @unlink(Pluf::f('upload_path') . '/' . $this->project->shortname . $conf->getVal('logo')); + $conf->delVal('logo'); + } + } +} diff --git a/src/IDF/Views.php b/src/IDF/Views.php index 0da8b60..beca428 100644 --- a/src/IDF/Views.php +++ b/src/IDF/Views.php @@ -41,7 +41,7 @@ class IDF_Views { $projects = self::getProjects($request->user); $stats = self::getProjectsStatistics ($projects); - + if ($api == true) return $projects; return Pluf_Shortcuts_RenderToResponse('idf/index.html', array('page_title' => __('Projects'), diff --git a/src/IDF/Views/Project.php b/src/IDF/Views/Project.php index 8bc92f8..807181e 100644 --- a/src/IDF/Views/Project.php +++ b/src/IDF/Views/Project.php @@ -31,6 +31,25 @@ Pluf::loadFunction('Pluf_Shortcuts_GetFormForModel'); */ class IDF_Views_Project { + /** + * Home page of a project. + */ + public $logo_precond = array('IDF_Precondition::baseAccess'); + public function logo($request, $match) + { + $prj = $request->project; + + $logo = $prj->getConf()->getVal('logo'); + if (empty($logo)) { + $url = Pluf::f('url_media') . '/idf/img/no_logo.png'; + return new Pluf_HTTP_Response_Redirect($url); + } + + $info = IDF_FileUtil::getMimeType($logo); + return new Pluf_HTTP_Response_File(Pluf::f('upload_path') . '/' . $prj->shortname . $logo, + $info[0]); + } + /** * Home page of a project. */ @@ -272,32 +291,32 @@ class IDF_Views_Project public function admin($request, $match) { $prj = $request->project; - $title = sprintf(__('%s Project Summary'), (string) $prj); - $form_fields = array('fields'=> array('name', 'shortdesc', - 'description')); + $title = sprintf(__('%s Project Summary'), (string) $prj); + $extra = array('project' => $prj); if ($request->method == 'POST') { - $form = Pluf_Shortcuts_GetFormForModel($prj, $request->POST, - $form_fields); + $form = new IDF_Form_ProjectConf(array_merge($request->POST, + $request->FILES), + $extra); if ($form->isValid()) { - $prj = $form->save(); + $form->save(); $request->user->setMessage(__('The project has been updated.')); $url = Pluf_HTTP_URL_urlForView('IDF_Views_Project::admin', array($prj->shortname)); return new Pluf_HTTP_Response_Redirect($url); } } else { - $form = Pluf_Shortcuts_GetFormForModel($prj, $prj->getData(), - $form_fields); + $form = new IDF_Form_ProjectConf($prj->getData(), $extra); } - $form->fields['description']->widget->attrs['cols'] = 68; - $form->fields['description']->widget->attrs['rows'] = 26; - $form->fields['shortdesc']->widget->attrs['size'] = 67; + + $logo = $prj->getConf()->getVal('logo'); return Pluf_Shortcuts_RenderToResponse('idf/admin/summary.html', array( 'page_title' => $title, 'form' => $form, + 'project' => $prj, + 'logo' => $logo, ), - $request); + $request); } /** diff --git a/src/IDF/conf/urls.php b/src/IDF/conf/urls.php index 29cf492..365536a 100644 --- a/src/IDF/conf/urls.php +++ b/src/IDF/conf/urls.php @@ -73,6 +73,11 @@ $ctl[] = array('regex' => '#^/p/([\-\w]+)/$#', 'base' => $base, 'model' => 'IDF_Views_Project', 'method' => 'home'); + +$ctl[] = array('regex' => '#^/p/([\-\w]+)/logo/$#', + 'base' => $base, + 'model' => 'IDF_Views_Project', + 'method' => 'logo'); $ctl[] = array('regex' => '#^/p/([\-\w]+)/timeline/(\w+)/$#', 'base' => $base, diff --git a/src/IDF/templates/idf/admin/summary.html b/src/IDF/templates/idf/admin/summary.html index 8ee1d71..5a44503 100644 --- a/src/IDF/templates/idf/admin/summary.html +++ b/src/IDF/templates/idf/admin/summary.html @@ -9,7 +9,7 @@ {/if} {/if} -
+ @@ -30,6 +30,30 @@ {$form.f.description|unsafe} + + + + + + + + +{if $logo} + + + + +{/if}
{$form.f.name.labelTag}:
{trans 'Current logo'}: +{if $logo} +{trans 'Project logo'} +{else} +{trans 'Your project does not have a logo configured yet.'} +{/if} +
{$form.f.logo.labelTag}:{if $form.f.logo.errors}{$form.f.logo.fieldErrors}{/if} +{$form.f.logo|unsafe} +
{$form.f.logo_remove.labelTag}:{if $form.f.logo_remove.errors}{$form.f.logo_remove.fieldErrors}{/if} +{$form.f.logo_remove|unsafe} +
  diff --git a/src/IDF/templates/idf/base-full.html b/src/IDF/templates/idf/base-full.html index f4248ba..f3be2ff 100644 --- a/src/IDF/templates/idf/base-full.html +++ b/src/IDF/templates/idf/base-full.html @@ -37,7 +37,7 @@
- {if $project}

{$project}

{/if} + {if $project}

{$project}{if $project.private}{trans 'Private project'}{/if}{$p}

{/if} {include 'idf/main-menu.html'}