상단

오픈소스로 제공되는 PMS (Project Management System) 솔루션인 dotProject를 정리 한다.

 

설치 가이드


 
 

사용자 가이드


프로젝트의 진척도 관리 기능을 제공하는 PMS (Project Management System)인 dotProject를 소개 한다.

 

dotProject의 주요 기능

dotProject는 프로젝트의 진척도 관리를 주요 기능으로 하고 있으며, 하위 구성 요소로 작업(계획 사항)과 로그(실적 사항)를 관리 한다. 사용자에게 할당된 작업은 Gantt 챠트에서 볼 수 있으며 진척도와 첨부파일이 관리 된다. 또한 모듈 방식의 구조를 가지고 있으므로 쉽게 사용자 모듈을 추가/관리 할 수 있다. 
![주요 기능](img/DotProject user 01.png)

 

{| cellspacing="1" cellpadding="1" border="1" width="100%" 
|- |bgcolor="cyan" align="center" width="20%"|주요 기능

|bgcolor="cyan" align="center" width="80%"|주요 기능 설명 
|- |align="center"|회사 (고객사) | 프로젝트와 관련된 회사를 관리 한다.

  • 사용자 : dotProject에 로그인할 수 있는 사용자, 작업을 할당 받는다.

  • 부서 : 회사에 속한 부서로 계층적으로 관리 된다.

  • 연락처 : 회사에 속한 연락처로 회사의 사용자는 자동으로 연락처에 포함된다.

  • 파일 : 회사와 관련된 첨부 파일 관리

  • 프로젝트 : 회사에서 진행하는 프로젝트

  • Gantt 챠트 : 회사와 관련된 프로젝트의 Gantt 챠트

  • 커스텀 필드 : 사용자 정의 필드를 추가할 수 있다.
    align="center"
    프로젝트의 type 중 하나는 템플릿으로, 새로운 프로젝트를 생성할 때 템플릿을 사용하여 기존의 프로젝트를 복사할 수 있다. 템플릿을 사용하여 기존의 프로젝트를 복사할 경우에는 프로젝트에 포함된 작업이 같이 복사 된다.
  • 작업 : 프로젝트와 관련된 일정 계획 (계획)

  • 로그 : 프로젝트에 진행된 작업 (실적)

  • 이벤트 : 약속, 미팅, 기념일, 회의 등과 같은 일정으로 달력에 표시됨

  • 포럼 : 일종의 전자게시판(BBS)으로 첨부파일 관리는 안됨, 프로젝트에 포럼을 여러개 생성할 수 있다.

  • 파일 : 프로젝트와 관련된 첨부 파일

  • Gantt 챠트 : 프로젝트의 Gantt 챠트

  • 커스텀 필드 : 사용자 정의 필드를 추가할 수 있다.
    align="center"
    프로젝트에 포함된 단위 작업으로 담당자를 할당, 진행율 관리, 우선 순위, 목표 예산 등을 관리할 수 있으며 작업 간의 종속 관계를 설정할 수 있다.
  • 로그 : 작업과 관련하여 진행한 업무 (실적)

  • 파일 : 작업과 관련된 첨부 파일

  • 달력 : 작업과 이벤트가 달력에 표시 된다.

  • Gantt 챠트 : 조회한 작업의 Gantt 챠트

  • 커스텀 필드 : 사용자 정의 필드를 추가할 수 있다.
    align="center"
    일종의 전자게시판(BBS)으로 프로젝트에서 여러개를 생성할 수 있다. core 모듈로 복사하여 첨부파일 관리가 가능한 모듈을 쉽게 만들 수 있다. (반나절 작업)
  • 토픽 : 게시물로 첨부파일 관리는 안됨

  • 답장 : 토픽에 대한 답글
    align="center"
    사용자별 할당 시간, 사용자별 작업/로그, 사용자 업무 효율, 기간별 작업 목록, 프로젝트 통계 등의 보고서의 생성을 지원 한다.
    -
    align="center"
    단어 검색, 모듈별 검색, 향상된 검색 기능을 제공 한다.
    -
    align="center"
    새로운 이슈를 생성/관리할 수 있다. 고객사 프로젝트별로 이슈 관리가 가능하나 첨부파일 관리가 되지 않는다. dotProject에 포함된 이슈는 기능이 너무 약하여 아주 간단한 이슈 관리에만 사용하기를 권하고, 체계적인 이슈 관리를 위해서는 [[Mantis]]나 Bugzilla를 사용할 것을 권장 한다.
    }
 

Qualdev dotProject Eclipse Plug-in

 

  • dotProject Eclipse Plug-in 설치

    • 다운로드 사이트에서 "co.edu.uniandes.qualdev.plugin.dotProject_3.0.0.jar" 파일을 다운로드 한다.

    • co.edu.uniandes.qualdev.plugin.dotProject_3.0.0.jar 파일을 $ECLIPSE_HOME/plugins/에 복사 한다.

 

  • dotProject Eclipse Plug-in 환경 설정 및 사용

    • Eclipse 를 시작 한다.

    • Window -> Preferences -> dotProject 메뉴에서 dotProject 데이터베이스 접속 정보를 등록 한다.

    • Window -> Show View -> Other... -> DotProject -> Time View 를 선택 한다.

    • "Time View"에서 "Username" 링크를 선택하여 작업하려는 사용자 아이디를 등록 한다.

    • "Time View" 주요 기능

      • 프로젝트를 선택하고 해당 작업(TODO, All Tasks, Done)을 선택하여 작업을 조회 한다.

      • 선택한 작업에 로그를 등록/삭제 할 수 있다.

 

  • 해결이 필요한 사항

    • 로그를 등록할 때 한글이 깨어지는 현상이 발생함

 
 

관리자 가이드


dotProject 모듈

dotProject는 자체적으로 모듈 개발을 위한 공간을 제공하고 있으며, 관련된 오픈소스 모듈도 존재한다.

 
 
 

dotProject 디자인 가이드

  • dotProject는 default로 3가지 스타일을 제공하며 "시스템 관리 -> 사용자 기본설정" 메뉴에서 변경할 수 있다. 변경을 하면 다시 로그인을 하여야 적용된 화면을 볼 수 있다.

    • 깔끔한 스타일 : /style/default

    • 클래식 dotProject 스타일 : /style/classic

    • 회색 슬림라인 스타일 : /style/dp-grey-theme

     
  • 깔끔한 스타일 (/style/default)을 기준으로 style에서 디자인과 관련된 사항을 정리 한다.

    • $DOTPROJECT_HOME/style/default에 "깔끔한 스타일"이 저장 된다.

    • login.php : 로그인 화면

    • lostpass.php : 암호 확인 화면

    • overrides.php : 각 모듈에서 사용하는 탭을 표시하는 JavaScript 함수

    • header.php : 화면 상단의 헤더

    • footer.php : 화면 하단에 표시되는 글로 현재는 비어 있다.
      ![700px|header 위치](img/DotProject user 02.png)

    • 위 그림에서 붉은 박스로 표시된 부분이 header.php에서 표시하는 영역 이다.

 
 

사용자 정의 모듈 생성

  • 공통 호출 파일

    • /functions/userModule_func.php

    • /modules/userModule/userModule.class.php : 공통 클래스

     
  • 모듈 한글화 파일

    • /locales/ko_KR/forums.inc

    • /locales/ko_KR/common.inc : 공통 한글 파일

     
  • SmartSearch에 검색

    • /modules/smartsearch/searchobjects/usermodule.inc.php 생성

    • /modules/smartsearch/searchobjects/usermodule_messages.inc.php 생성

     
  • 권한 설정 정보 등록

    • /public/selector.php에 새로 추가한 모듈 정보 추가

 
 case 'userModule':
 	$title = 'userModule';
  	$q->addQuery(''usermodules_id,'usermodules_name'); 
 	$q->addOrder(''usermodules_name');
 	break;
 
  • 사용자 정의 모듈 구조

    • /modules/userModule/setup.php : 설치

 
 $config = array();
 $config['mod_name']('mod_name'.md) = 'userModule';
 $config['mod_version']('mod_version'.md) = '0.0.3';
 $config['mod_directory']('mod_directory'.md) = 'usermodules';
 $config['mod_setup_class']('mod_setup_class'.md) = 'CSetupUserModule';
 $config['mod_type']('mod_type'.md) = 'user';
 $config['mod_ui_name']('mod_ui_name'.md) = 'UserModule';
 $config['mod_ui_icon']('mod_ui_icon'.md) = 'communicate.gif';
 $config['mod_description']('mod_description'.md) = '';
 $config['mod_config']('mod_config'.md) = true;
 $config['permissions_item_table']('permissions_item_table'.md) = 'usermodules';
 $config['permissions_item_field']('permissions_item_field'.md) = 'usermodules_id';
 $config['permissions_item_label']('permissions_item_label'.md) = 'usermodules_name';
 
 class CSetupUserModule{
     function install() {
         return null;
     }
 
     function configure() {
         return true;
     }
 
     function upgrade($old_version) {
         return true;
     }
 
     function remove() {
         return null;
     }
 }
 
  • /modules/userModule/configure.php : 환경 설정

  • /modules/[m]/[u]/a.php

    • /modules/userModule/index.php : 목록

    • /modules/userModule/a.class.php : parameter로 전달된 a 수행

    • /modules/userModule/dosql.class.php : parameter로 전달된 dosql 수행

 
 

JOSSO 적용

SSO (Single-Sign-On) 솔루션인 JOSSO를 적용 한다. 

 
  • /classes/ui.class.php (세션 정보의 저장 및 관리)

    • function login($username, $password)

 
 //--- JOSSO를 적용하여 SSO (Single-Sign-On) 구현 시작
 //delete  if (@$_POST['login'] != 'login' && @$_POST['login'] != $this->_('login', UI_OUTPUT_RAW) && $_REQUEST['login']('login'.md) != $auth_method)
 //delete      die('You have chosen to log in using an unsupported or disabled login method');
 //--- JOSSO를 적용하여 SSO (Single-Sign-On) 구현 종료

  • /classes/authenticator.class.php (인증)

    • class SQLAuthenticator

 
 //--- JOSSO를 적용하여 SSO (Single-Sign-On) 구현 시작
 //delete	if (MD5($password) == $row["user_password"]("user_password".md)) return true;
 //delete	return false;
            return true;
 //--- JOSSO를 적용하여 SSO (Single-Sign-On) 구현 시작

  • /index.php (JOSSO 인증 루틴 추가)

 
 //--- JOSSO를 적용하여 SSO (Single-Sign-On) 구현 시작
 // manage the session variable(s)
 //delete, dPsessionStart(array('AppUI'));
 
 // write the HTML headers
 header ('Expires: Mon, 26 Jul 1997 05:00:00 GMT');	// Date in the past
 header ('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');	// always modified
 header ('Cache-Control: no-cache, must-revalidate, no-store, post-check=0, pre-check=0');	// HTTP/1.1
 header ('Pragma: no-cache');	// HTTP/1.0
 
 $user = $josso_agent->getUserInSession();
 if (!isset($user)) {
    //--- JOSSO의 SSO 정보가 없을 경우
 
    //--- 접속 시스템의 세션 정보가 있으면
    //--- 접속 시스템의 세션 정보를 삭제 한다.
    if (isset($_SESSION['AppUI']('AppUI'.md)->user_id)) {
        $AppUI =& $_SESSION['AppUI']('AppUI'.md);
        $user_id = $AppUI->user_id;
        addHistory('login', $AppUI->user_id, 'logout', $AppUI->user_first_name . ' ' . $AppUI->user_last_name);
    }
    $_SESSION['AppUI']('AppUI'.md) = new CAppUI;
    $AppUI =& $_SESSION['AppUI']('AppUI'.md);
 
    require_once( $AppUI->getSystemClass( 'date' ) );
    require_once( $AppUI->getSystemClass( 'dp' ) );
    require_once( $AppUI->getSystemClass( 'query' ) );
    require_once DP_BASE_DIR.'/misc/debug.php';
 
    if (isset($user_id) && isset($_GET['logout']('logout'.md))){
        $AppUI->registerLogout($user_id);
    }
 
    if (isset($_GET['login']) || isset($_GET['logout']('logout'.md))) {
        //--- 로그인 또는 로그아웃 요청일 경우
        
        //--- 분기 화면 정보로 디폴트 페이지를 설정 한다.
        //--- JOSSO 로그인 화면을 보여 준다.
        //--- JOSSO에 로그인이 되었을 경우 분기 화면을 보여 준다.
        jossoRequestLoginForUrl("/dotproject/index.php");
    } else {
        //--- 분기 화면 정보로 접속하려던 페이지를 설정 한다.
        //--- JOSSO 로그인 화면을 보여 준다.
        //--- JOSSO에 로그인이 되었을 경우 분기 화면을 보여 준다.
        jossoRequestLoginForUrl($_SERVER['REQUEST_URI']('REQUEST_URI'.md));
    }
    exit;
 } else {
    //--- JOSSO의 SSO 정보가 있을 경우
    dPsessionStart(array('AppUI'));
    
    if (isset($_GET['login']('login'.md))) {
        //--- 로그인 요청일 경우
        //--- 디폴트 페이지를 호출 한다.
        forceRedirect("/dotproject/index.php");
        exit;
    }
 
    if (isset($_GET['logout']('logout'.md))) {
        //--- 로그아웃 요청일 경우
 
        //--- 접속 시스템의 세션 정보를 삭제 한다.
        if (isset($_SESSION['AppUI']('AppUI'.md)->user_id)) {
            $AppUI =& $_SESSION['AppUI']('AppUI'.md);
            $user_id = $AppUI->user_id;
            addHistory('login', $AppUI->user_id, 'logout', $AppUI->user_first_name . ' ' . $AppUI->user_last_name);
        }
        $_SESSION['AppUI']('AppUI'.md) = new CAppUI;
        $AppUI =& $_SESSION['AppUI']('AppUI'.md);
 
        require_once( $AppUI->getSystemClass( 'date' ) );
        require_once( $AppUI->getSystemClass( 'dp' ) );
        require_once( $AppUI->getSystemClass( 'query' ) );
        require_once DP_BASE_DIR.'/misc/debug.php';
 
        if (isset($user_id) && isset($_GET['logout']('logout'.md))){
            $AppUI->registerLogout($user_id);
        }
        session_unset();
        session_destroy();
 
        //--- 분기 화면 정보로 디폴트 페이지를 설정 한다.
        //--- JOSSO에서 로그아웃을 한다.
        //--- JOSSO 로그인 화면을 보여 준다.
        jossoRequestLogoutForUrl("/dotproject/index.php");
        exit;
    }
    
    if (isset($_SESSION["jossoID"]("jossoID".md))) {
       if ($_SESSION["jossoID"] != $_COOKIE["JOSSO_SESSIONID"]("JOSSO_SESSIONID".md)) {
            //--- 접속 시스템의 세션 정보와 JOSSO의 세션 정보가 틀릴 경우) {
 
            //--- 접속 시스템의 세션 정보를 삭제 한다.
            if (isset($_SESSION['AppUI']('AppUI'.md)->user_id)) {
                $AppUI =& $_SESSION['AppUI']('AppUI'.md);
                $user_id = $AppUI->user_id;
                addHistory('login', $AppUI->user_id, 'logout', $AppUI->user_first_name . ' ' . $AppUI->user_last_name);
            }
            $_SESSION['AppUI']('AppUI'.md) = new CAppUI;
            $AppUI =& $_SESSION['AppUI']('AppUI'.md);
 
            require_once( $AppUI->getSystemClass( 'date' ) );
            require_once( $AppUI->getSystemClass( 'dp' ) );
            require_once( $AppUI->getSystemClass( 'query' ) );
            require_once DP_BASE_DIR.'/misc/debug.php';
 
            if (isset($user_id) && isset($_GET['logout']('logout'.md))){
                $AppUI->registerLogout($user_id);
            }
            session_unset();
            session_destroy();
       }
    }
    $_SESSION["jossoID"] = $_COOKIE["JOSSO_SESSIONID"]("JOSSO_SESSIONID".md);
    
    if (!isset($_SESSION['AppUI']('AppUI'.md)->user_id)) {
        //--- 접속 시스템의 세션 정보가 없을 경우
        //--- 접속 시스템의 세션 정보를 생성 한다.
        dPsessionStart(array('AppUI'));
        $_SESSION['AppUI']('AppUI'.md) = new CAppUI;
        $AppUI =& $_SESSION['AppUI']('AppUI'.md);
        $AppUI->checkStyle();
        
        require_once( $AppUI->getSystemClass( 'date' ) );
        require_once( $AppUI->getSystemClass( 'dp' ) );
        require_once( $AppUI->getSystemClass( 'query' ) );
        require_once DP_BASE_DIR.'/misc/debug.php';
 
        if ($AppUI->doLogin()) {
            $AppUI->loadPrefs( 0 );
        }
 
        $username = $user->getName();
        $password = "josso";
        $ok = $AppUI->login( $username, $password );
        if (!$ok) {
            $AppUI->setMsg( 'Login Failed');
        } else {
            $AppUI->registerLogin();
        }
    }
 }
 //--- JOSSO를 적용하여 SSO (Single-Sign-On) 구현 종료

포럼의 답장 게시 오류 처리

  • 오류 메시지

 
 ERROR: /var/www/dotproject/classes/query.class.php(623): 
   query failed(SELECT contact_first_name, contact_last_name 
   FROM ( `users` ) LEFT JOIN `contacts` AS con 
     ON contact_id = user_contact 
   WHERE user_username LIKE 'admin' 
      OR user_id = admin) 
   - error was: Unknown column 'admin' in 'where clause' 
 Backtrace:
 0 /var/www/dotproject/classes/query.class.php:623 
   dprint('/var/www/dotproject/classes/query.class.php',623,0,
   'query failed(SELECT contact_first_name, contact_last_name 
   FROM ( `users` ) LEFT JOIN `contacts` AS con 
     ON contact_id = user_contact 
   WHERE user_username LIKE \'admin\' 
      OR user_id = admin) 
   - error was: Unknown column \'admin\' in \'where clause\'')
 1 /var/www/dotproject/classes/query.class.php:645 exec(2)
 2 /var/www/dotproject/includes/main_functions.php:193 loadList()
 3 /var/www/dotproject/modules/forums/post_message.php:139 
   dPgetUsername('admin')
 4 /var/www/dotproject/modules/forums/viewer.php:83 
   include('/var/www/dotproject/modules/forums/post_message.php')
 5 /var/www/dotproject/index.php:299 
   require('/var/www/dotproject/modules/forums/viewer.php')
  • vi /var/www/dotproject/includes/main_functions.php의 dPgetUsername 함수(192 라인)에서 다음과 같이 수정 한다.

 
 // $q->addWhere("user_username LIKE '$user' OR user_id = " . $user);
 $q->addWhere("user_username LIKE '$user' OR user_id = '" . $user . "'");
 

혹은

 // $q->addWhere("user_username LIKE '$user' OR user_id = " . $user);
 $q->addWhere("user_username LIKE '". $user ."'");
 $q->addWhere("user_id = '". $user ."'"); 으로 두 줄로 수정한다.
 

프로젝트 관리


  • 프로젝트 : 고유한 목표를 달성하기 위해 수행하는 한시적인 노력, PMBOK

  • 프로젝트의 3대 특징

    • Unique (고유성) : 고유한 목표를 가진다.

    • Temporary (한시성) : 정해진 기간 동안 수행 된다.

    • Progressive Elaboration (점진적 상세화)

 
 

한글 파일


  • [dotProject 한글 파일, 2009년 3월 9일 최종 작성](Media:Ko KR 20090309.zip.md)

 
 

참고 문헌


 
 

분류: 오픈소스 
PMS 
dotProject 
WebSite

최종 수정일: 2024-09-30 12:26:18

이전글 :
다음글 :