9 namespace Fossology\UI\Page;
16 use Symfony\Component\HttpFoundation\JsonResponse;
17 use Symfony\Component\HttpFoundation\Request;
18 use Symfony\Component\HttpFoundation\Response;
19 use Symfony\Component\HttpFoundation\RedirectResponse;
23 const NAME =
"admin_custom_text_management";
25 function __construct()
27 parent::__construct(self::NAME, array(
28 self::TITLE =>
"Add Custom Text",
29 self::MENU_LIST =>
"Admin::Text Management::Add",
30 self::REQUIRES_LOGIN =>
true,
40 protected function handle(Request $request)
49 return $this->flushContent(_(
'Access denied. Admin privileges required.'));
52 $action = $request->get(
'action');
55 if ($action ==
'check_duplicate' && $request->getMethod() ==
'POST') {
60 if ($request->get(
'updateit') || $request->get(
'addit')) {
61 $resultstr = $this->savePhrase($request, $userId, $groupId);
62 if (strpos($resultstr,
'ERROR') !==
false) {
63 $vars = $this->getEditFormVars($request->get(
'cp_pk', 0));
64 $vars[
'message'] = $resultstr;
65 return $this->
render(
'admin_custom_text_edit.html.twig', $this->mergeWithDefault($vars));
68 $redirectUrl =
Traceback_uri() .
'?mod=admin_custom_text_list';
69 return new RedirectResponse($redirectUrl);
74 if ($request->get(
'edit') !==
null) {
75 $cp_pk = intval($request->get(
'edit'));
76 $vars = $this->getEditFormVars($cp_pk);
77 return $this->
render(
'admin_custom_text_edit.html.twig', $this->mergeWithDefault($vars));
81 $vars = $this->getEditFormVars(0);
82 return $this->
render(
'admin_custom_text_edit.html.twig', $this->mergeWithDefault($vars));
88 private function getEditFormVars($cp_pk)
94 $phraseData = $this->getPhraseData($cp_pk);
96 $vars = array_merge($vars, $phraseData);
97 $vars[
'isEdit'] =
true;
99 $vars[
'selectedLicenses'] = $this->getAssociatedLicenses($cp_pk);
103 $vars[
'isEdit'] =
false;
105 $vars[
'selectedLicenses'] = array();
108 $vars[
'formAction'] =
Traceback_uri() .
'?mod=' . self::NAME;
109 $vars[
'updateParam'] = $vars[
'isEdit'] ?
'updateit' :
'addit';
110 $vars[
'textParam'] =
'text';
111 $vars[
'acknowledgementParam'] =
'acknowledgement';
112 $vars[
'commentsParam'] =
'comments';
113 $vars[
'userFkParam'] =
'user_fk';
114 $vars[
'groupFkParam'] =
'group_fk';
115 $vars[
'licensesParam'] =
'licenses';
116 $vars[
'isActiveParam'] =
'is_active';
119 $vars[
'licenseOptions'] = $this->getLicenseOptions();
124 $vars[
'bulkDataUsers'] = $userDao->getUsersByGroup();
134 $textMd5 =
trim($request->get(
'text_md5'));
135 $currentCpPk = intval($request->get(
'cp_pk'));
137 if (empty($textMd5)) {
138 return new JsonResponse(array(
'duplicate' =>
false));
141 $isDuplicate = $this->checkDuplicateTextMd5($textMd5, $currentCpPk > 0 ? $currentCpPk :
null);
143 return new JsonResponse(array(
'duplicate' => $isDuplicate));
149 private function checkDuplicateTextMd5($textMd5, $excludeCpPk =
null)
152 $dbManager = $this->
getObject(
'db.manager');
154 $sql =
"SELECT cp_pk FROM custom_phrase WHERE text_md5 = $1";
155 $params = array($textMd5);
158 $sql .=
" AND cp_pk != $2";
159 $params[] = $excludeCpPk;
162 $result = $dbManager->getSingleRow($sql, $params, __METHOD__);
164 return $result !==
false;
170 private function getPhraseData($cp_pk)
173 $dbManager = $this->
getObject(
'db.manager');
175 $sql =
"SELECT * FROM custom_phrase WHERE cp_pk = $1";
176 $row = $dbManager->getSingleRow($sql, array($cp_pk), __METHOD__);
179 $row[
'is_active'] = $dbManager->booleanFromDb($row[
'is_active']);
189 private function getAssociatedLicenses($cp_pk)
192 $dbManager = $this->
getObject(
'db.manager');
194 $sql =
"SELECT lr.rf_pk, lr.rf_shortname, cplm.removing
195 FROM custom_phrase_license_map cplm
196 JOIN license_ref lr ON cplm.rf_fk = lr.rf_pk
197 WHERE cplm.cp_fk = $1
198 ORDER BY lr.rf_shortname";
200 $result = $dbManager->getRows($sql, array($cp_pk));
203 foreach ($result as $row) {
205 'rf_pk' => $row[
'rf_pk'],
206 'rf_shortname' => $row[
'rf_shortname'],
207 'removing' => $dbManager->booleanFromDb($row[
'removing'])
217 private function savePhrase(Request $request, $userId, $groupId)
219 $cp_pk = intval($request->get(
'cp_pk'));
223 $user_fk = intval($request->get(
'user_fk'));
224 $group_fk = intval($request->get(
'group_fk'));
225 $licenseData = $request->get(
'license_data');
226 $is_active = $request->get(
'is_active') ==
'on' ?
'true' :
'false';
229 return _(
"ERROR: The text field cannot be empty.");
233 $licenseMappings = array();
234 if (!empty($licenseData)) {
235 $decodedData = json_decode($licenseData,
true);
236 if (is_array($decodedData)) {
237 foreach ($decodedData as $item) {
238 if (!empty($item[
'licenseId'])) {
239 $licenseMappings[] = array(
240 'rf_pk' => intval($item[
'licenseId']),
241 'removing' => ($item[
'action'] ===
'Remove')
249 if (empty($licenseMappings)) {
250 return _(
"ERROR: At least one license must be associated with the custom text.");
254 $textMd5 = md5($text);
257 if ($this->checkDuplicateTextMd5($textMd5, $cp_pk > 0 ? $cp_pk :
null)) {
258 return _(
"ERROR: A custom text with the same content already exists in the database. Please modify the text or use the existing entry.");
262 if (empty($user_fk)) {
265 if (empty($group_fk)) {
266 $group_fk = $groupId;
271 $dbManager = $this->
getObject(
'db.manager');
278 $sql =
"UPDATE custom_phrase SET
279 text = $2, text_md5 = $3, acknowledgement = $4, comments = $5,
280 user_fk = $6, group_fk = $7, is_active = $8
282 $params = array($cp_pk, $text, $textMd5, $acknowledgement, $comments,
283 $user_fk, $group_fk, $is_active);
284 $dbManager->prepare($stmt = __METHOD__ .
".update", $sql);
285 $dbManager->freeResult($dbManager->execute($stmt, $params));
288 $deleteSql =
"DELETE FROM custom_phrase_license_map WHERE cp_fk = $1";
289 $dbManager->prepare($deleteStmt = __METHOD__ .
".delete_licenses", $deleteSql);
290 $dbManager->freeResult($dbManager->execute($deleteStmt, array($cp_pk)));
294 $sql =
"INSERT INTO custom_phrase
295 (text, text_md5, acknowledgement, comments, user_fk, group_fk, is_active, created_date)
296 VALUES ($1, $2, $3, $4, $5, $6, $7, CURRENT_TIMESTAMP) RETURNING cp_pk";
297 $params = array($text, $textMd5, $acknowledgement, $comments,
298 $user_fk, $group_fk, $is_active);
299 $dbManager->prepare($stmt = __METHOD__ .
".insert", $sql);
300 $result = $dbManager->execute($stmt, $params);
301 $row = $dbManager->fetchArray($result);
302 $cp_pk = $row[
'cp_pk'];
303 $dbManager->freeResult($result);
307 if (!empty($licenseMappings)) {
308 $insertLicenseSql =
"INSERT INTO custom_phrase_license_map (cp_fk, rf_fk, removing) VALUES ($1, $2, $3)";
309 $dbManager->prepare($insertLicenseStmt = __METHOD__ .
".insert_license", $insertLicenseSql);
311 foreach ($licenseMappings as $mapping) {
312 if (!empty($mapping[
'rf_pk'])) {
313 $removingValue = $mapping[
'removing'] ?
'true' :
'false';
314 $dbManager->freeResult($dbManager->execute($insertLicenseStmt, array($cp_pk, $mapping[
'rf_pk'], $removingValue)));
320 $dbManager->commit();
322 return $cp_pk > 0 ? _(
"Custom text updated successfully.") :
323 _(
"Custom text added successfully.");
325 }
catch (\Exception $e) {
326 $dbManager->rollback();
327 return _(
"ERROR: Failed to save custom text: ") . $e->getMessage();
331 private function getLicenseOptions()
334 $dbManager = $this->
getObject(
'db.manager');
336 $sql =
"SELECT rf_pk, rf_shortname FROM license_ref WHERE rf_active = true ORDER BY rf_shortname";
337 $result = $dbManager->getRows($sql);
340 foreach ($result as $row) {
341 $options[$row[
'rf_pk']] = $row[
'rf_shortname'];
348 register_plugin(
new AdminCustomTextManagement());
Contains the constants and helpers for authentication of user.
static getUserId()
Get the current user's id.
static getGroupId()
Get the current user's group id.
static isAdmin()
Check if user is admin.
render($templateName, $vars=null, $headers=null)
static replaceUnicodeControlChar($input, $replace="")
checkDuplicateAjax(Request $request)
Traceback_uri()
Get the URI without query to this location.
char * trim(char *ptext)
Trimming whitespace.