partkeepr

fork of partkeepr
git clone https://git.e1e0.net/partkeepr.git
Log | Files | Refs | Submodules | README | LICENSE

commit dbc31a734259153a0433b44e04da354da822cd33
parent 6385d7cb652e7d6287396126ff99a0d79ee40c45
Author: Timo A. Hummel <timo@netraver.de>
Date:   Mon,  6 Jun 2011 22:38:12 +0200

Added user management

Diffstat:
Mfrontend/index.html | 5+++++
Mfrontend/js/Components/MenuBar.js | 13+++++++++++++
Afrontend/js/Components/User/UserEditor.js | 16++++++++++++++++
Afrontend/js/Components/User/UserEditorComponent.js | 21+++++++++++++++++++++
Afrontend/js/Components/User/UserGrid.js | 10++++++++++
Afrontend/js/Models/User.js | 12++++++++++++
Msrc/de/RaumZeitLabor/PartDB2/Auth/User.php | 24+++++++++++++++++++++++-
Asrc/de/RaumZeitLabor/PartDB2/User/UserManager.php | 65+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/de/RaumZeitLabor/PartDB2/User/UserService.php | 78++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
9 files changed, 243 insertions(+), 1 deletion(-)

diff --git a/frontend/index.html b/frontend/index.html @@ -51,6 +51,7 @@ <script type="text/javascript" src="js/Models/Distributor.js"></script> <script type="text/javascript" src="js/Models/Manufacturer.js"></script> <script type="text/javascript" src="js/Models/ManufacturerICLogo.js"></script> + <script type="text/javascript" src="js/Models/User.js"></script> <script type="text/javascript" src="js/Models/Category.js"></script> <script type="text/javascript" src="js/Models/Part.js"></script> <script type="text/javascript" src="js/Models/PartDistributor.js"></script> @@ -93,6 +94,10 @@ <script type="text/javascript" src="js/Components/CategoryEditor/CategoryEditorWindow.js"></script> <script type="text/javascript" src="js/Components/CategoryEditor/CategoryEditorTree.js"></script> + <script type="text/javascript" src="js/Components/User/UserEditor.js"></script> + <script type="text/javascript" src="js/Components/User/UserEditorComponent.js"></script> + <script type="text/javascript" src="js/Components/User/UserGrid.js"></script> + <script type="text/javascript" src="js/Components/Part/PartsManager.js"></script> <script type="text/javascript" src="js/Components/Part/PartsGrid.js"></script> <script type="text/javascript" src="js/Components/Part/PartDistributorGrid.js"></script> diff --git a/frontend/js/Components/MenuBar.js b/frontend/js/Components/MenuBar.js @@ -16,6 +16,10 @@ Ext.define('PartDB2.MenuBar', { },{ text: i18n('Edit Distributors'), handler: this.editDistributors + },{ + text: i18n('Edit Users'), + handler: this.editUsers, + icon: "resources/silkicons/user.png" }] }); @@ -63,6 +67,15 @@ Ext.define('PartDB2.MenuBar', { PartDB2.getApplication().addItem(j); j.show(); + }, + editUsers: function () { + var j = Ext.create("PartDB2.UserEditorComponent", { + title: i18n("Users"), + closable: true + }); + + PartDB2.getApplication().addItem(j); + j.show(); } }); \ No newline at end of file diff --git a/frontend/js/Components/User/UserEditor.js b/frontend/js/Components/User/UserEditor.js @@ -0,0 +1,16 @@ +Ext.define('PartDB2.UserEditor', { + extend: 'PartDB2.Editor', + alias: 'widget.UserEditor', + items: [{ + xtype: 'textfield', + name: 'username', + fieldLabel: i18n("User") + },{ + xtype: 'textfield', + inputType: "password", + name: 'password', + fieldLabel: i18n("Password") + }], + saveText: i18n("Save User"), + model: 'PartDB2.User' +}); diff --git a/frontend/js/Components/User/UserEditorComponent.js b/frontend/js/Components/User/UserEditorComponent.js @@ -0,0 +1,20 @@ +Ext.define('PartDB2.UserEditorComponent', { + extend: 'PartDB2.EditorComponent', + alias: 'widget.UserEditorComponent', + gridClass: 'PartDB2.UserGrid', + editorClass: 'PartDB2.UserEditor', + newItemText: i18n("New User"), + deleteMessage: i18n("Do you really wish to delete the user '%s'?"), + deleteTitle: i18n("Delete User"), + initComponent: function () { + this.createStore({ + model: "User", + sorters: [{ + property: 'username', + direction:'ASC' + }] + }); + + this.callParent(); + } +});+ \ No newline at end of file diff --git a/frontend/js/Components/User/UserGrid.js b/frontend/js/Components/User/UserGrid.js @@ -0,0 +1,9 @@ +Ext.define('PartDB2.UserGrid', { + extend: 'PartDB2.EditorGrid', + alias: 'widget.UserGrid', + columns: [ + {header: i18n("User"), dataIndex: 'username', flex: 1} + ], + addButtonText: i18n("Add User"), + deleteButtonText: i18n("Delete User") +});+ \ No newline at end of file diff --git a/frontend/js/Models/User.js b/frontend/js/Models/User.js @@ -0,0 +1,11 @@ +PartDB2.User = Ext.define("User", { + extend: "Ext.data.Model", + fields: [ + { id: 'id', name: 'id', type: 'int' }, + { name: 'username', type: 'string'} + ], + proxy: PartDB2.getRESTProxy("User"), + getName: function () { + return this.get("username"); + } +});+ \ No newline at end of file diff --git a/src/de/RaumZeitLabor/PartDB2/Auth/User.php b/src/de/RaumZeitLabor/PartDB2/Auth/User.php @@ -12,7 +12,7 @@ class User { */ private $id; - /** @Column(length=50) */ + /** @Column(length=50,unique=true) */ private $username; /** @Column(length=32) */ @@ -135,5 +135,27 @@ class User { } } + /** + * Returns the ID of this object. + * @param none + * @return int The ID of this object + */ + public function getId () { + return $this->id; + } + + /** + * Serializes the user object and returns it as array, suitable + * to process via json_encode. + * @param none + * @return array An array containing the object information + */ + public function serialize () { + return array( + "id" => $this->getId(), + "username" => $this->getUsername() + ); + } + } ?> \ No newline at end of file diff --git a/src/de/RaumZeitLabor/PartDB2/User/UserManager.php b/src/de/RaumZeitLabor/PartDB2/User/UserManager.php @@ -0,0 +1,64 @@ +<?php +namespace de\RaumZeitLabor\PartDB2\User; +declare(encoding = 'UTF-8'); + +use de\RaumZeitLabor\PartDB2\Util\Singleton, + de\RaumZeitLabor\PartDB2\Auth\User, + de\RaumZeitLabor\PartDB2\PartDB2, + de\RaumZeitLabor\PartDB2\Category\CategoryManager, + de\RaumZeitLabor\PartDB2\User\Exceptions\UserNotFoundException; + +class UserManager extends Singleton { + public function getUsers ($start = 0, $limit = 10, $sort = "name", $dir = "asc", $filter = "") { + + $qb = PartDB2::getEM()->createQueryBuilder(); + $qb->select("st.id, st.username")->from("de\RaumZeitLabor\PartDB2\Auth\User","st"); + + if ($filter != "") { + $qb = $qb->where("st.username LIKE :filter"); + $qb->setParameter("filter", "%".$filter."%"); + } + + if ($limit > -1) { + $qb->setMaxResults($limit); + $qb->setFirstResult($start); + } + + $qb->orderBy("st.".$sort, $dir); + + $query = $qb->getQuery(); + + $result = $query->getResult(); + + $totalQueryBuilder = PartDB2::getEM()->createQueryBuilder(); + $totalQueryBuilder->select("COUNT(st.id)")->from("de\RaumZeitLabor\PartDB2\Auth\User","st"); + + + + if ($filter != "") { + $totalQueryBuilder = $totalQueryBuilder->where("st.name LIKE :filter"); + $totalQueryBuilder->setParameter("filter", "%".$filter."%"); + } + + $totalQuery = $totalQueryBuilder->getQuery(); + + return array("data" => $result, "totalCount" => $totalQuery->getSingleScalarResult()); + } + + public function getUser ($id) { + $user = PartDB2::getEM()->find("de\RaumZeitLabor\PartDB2\Auth\User", $id); + + if ($user) { + return $user; + } else { + throw new UserNotFoundException(); + } + } + + public function deleteUser ($id) { + $user = $this->getUser($id); + + PartDB2::getEM()->remove($user); + PartDB2::getEM()->flush(); + } +}+ \ No newline at end of file diff --git a/src/de/RaumZeitLabor/PartDB2/User/UserService.php b/src/de/RaumZeitLabor/PartDB2/User/UserService.php @@ -0,0 +1,77 @@ +<?php +namespace de\RaumZeitLabor\PartDB2\User; +use de\RaumZeitLabor\PartDB2\Service\RestfulService; + +declare(encoding = 'UTF-8'); + +use de\RaumZeitLabor\PartDB2\Service\Service; +use de\RaumZeitLabor\PartDB2\PartDB2, + de\RaumZeitLabor\PartDB2\Auth\User, + de\RaumZeitLabor\PartDB2\Session\SessionManager; + +class UserService extends Service implements RestfulService { + public function get () { + if ($this->hasParameter("id")) { + return UserManager::getInstance()->getUser($this->getParameter("id"))->serialize(); + } else { + if ($this->hasParameter("sort")) { + $tmp = json_decode($this->getParameter("sort"), true); + + $aSortParams = $tmp[0]; + } else { + $aSortParams = array( + "property" => "username", + "direction" => "ASC"); + } + return UserManager::getInstance()->getUsers( + $this->getParameter("start", $this->getParameter("start", 0)), + $this->getParameter("limit", $this->getParameter("limit", 25)), + $this->getParameter("sortby", $aSortParams["property"]), + $this->getParameter("dir", $aSortParams["direction"]), + $this->getParameter("query", "")); + } + } + + public function create () { + $this->requireParameter("username"); + + $user = new User; + + $this->setUserData($user); + + PartDB2::getEM()->persist($user); + PartDB2::getEM()->flush(); + + return array("data" => $user->serialize()); + } + + private function setUserData (User $user) { + $user->setUsername($this->getParameter("username")); + + if ($this->hasParameter("password") && $this->getParameter("password") !== "") { + $user->setHashedPassword($this->getParameter("password")); + } else { + $user->setHashedPassword(""); + } + } + + public function update () { + $this->requireParameter("id"); + $this->requireParameter("username"); + $user = UserManager::getInstance()->getUser($this->getParameter("id")); + + $this->setUserData($user); + PartDB2::getEM()->flush(); + + return array("data" => $user->serialize()); + + } + + public function destroy () { + $this->requireParameter("id"); + + UserManager::getInstance()->deleteUser($this->getParameter("id")); + + return array("data" => null); + } +}+ \ No newline at end of file