Skip to content

Commit

Permalink
Merge pull request #3 from SanzharAkparaliev/shaha
Browse files Browse the repository at this point in the history
change logic generate field
  • Loading branch information
SanzharAkparaliev authored Jul 30, 2024
2 parents 10f6fd2 + b6d4e61 commit f661ad5
Show file tree
Hide file tree
Showing 8 changed files with 148 additions and 176 deletions.
1 change: 1 addition & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,5 @@ axelor {

dependencies {
api project(":modules:axelor-base")
implementation 'com.fasterxml.jackson.core:jackson-databind:2.13.3'
}
Binary file not shown.
Binary file modified build/classes/java/main/com/axelor/script/web/FieldController.class
Binary file not shown.
Binary file modified build/libs/axelor-script-8.0.2.jar
Binary file not shown.
6 changes: 3 additions & 3 deletions build/resources/main/views/AppScript.xml
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@
</panel-tabs>
<panel>
<button name="importPermissions" onClick="axelor-script-generate-permission,save"
title="Generate Permissions"/>
<button name="importFields" onClick="axelor-script-field-permission" title="Generate Fields"/>
<button name="translation" onClick="axelor-script-field-translation" title="Translate"/>
title="Generate Permissions" colSpan="4"/>
<button name="importFields" onClick="axelor-script-field-permission" title="Generate Fields" colSpan="4"/>
<button name="translation" onClick="axelor-script-field-translation" title="Translate" colSpan="4"/>
</panel>
</form>

Expand Down
Binary file modified build/tmp/compileJava/previous-compilation-data.bin
Binary file not shown.
264 changes: 121 additions & 143 deletions src/main/java/com/axelor/script/service/impl/FieldServiceImpl.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.axelor.script.service.impl;

import com.axelor.auth.db.Permission;
import com.axelor.auth.db.repo.PermissionRepository;
import com.axelor.db.Query;
import com.axelor.meta.db.MetaField;
Expand All @@ -12,155 +11,134 @@
import com.axelor.meta.db.repo.MetaPermissionRuleRepository;
import com.axelor.script.service.FieldService;
import com.google.inject.Inject;
import com.google.inject.persist.Transactional;

import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.Map;
import java.util.logging.Logger;

public class FieldServiceImpl implements FieldService {
private static final Logger logger = Logger.getLogger(FieldServiceImpl.class.getName());

private final MetaModelRepository metaModelRepository;
private final MetaPermissionRuleRepository metaPermissionRuleRepository;
private final MetaPermissionRepository metaPermissionRepository;
private final PermissionRepository permissionRepository;

@Inject
public FieldServiceImpl(
MetaModelRepository metaModelRepository,
MetaPermissionRuleRepository metaPermissionRuleRepository,
MetaPermissionRepository metaPermissionRepository,
PermissionRepository permissionRepository) {
this.metaModelRepository = metaModelRepository;
this.metaPermissionRuleRepository = metaPermissionRuleRepository;
this.metaPermissionRepository = metaPermissionRepository;
this.permissionRepository = permissionRepository;
}

@Override
@Transactional
// public void generateMetaPermissionRules() {
// List<MetaPermission> metaPermissions = metaPermissionRepository.all().fetch();
// List<Permission> permissions = permissionRepository.all().fetch();
// metaPermissions.forEach(this::processMetaPermission);
// }
public void generateMetaPermissionRules(List<MetaModel> models) {
models.forEach(metaModel -> {
// Получаем все поля, для которых нужно сгенерировать разрешения
List<MetaField> metaFields = scriptFindByModel(metaModel);

// Проходим по всем полям и создаем разрешения
metaFields.stream()
.filter(MetaField::getGenerate)
.forEach(field -> {
List<MetaPermission> metaPermissions = metaPermissionRepository.all().fetch();
metaPermissions.forEach(metaPermission -> processMetaPermission(metaPermission, field));
});
});
}

// private void processMetaPermission(MetaPermission metaPermission) {
// // получаем модель
// MetaModel metaModel = findMetaModelByName(metaPermission.getObject());
// if (metaModel == null) {
// logger.warning(
// "MetaModel not found for MetaPermission object: " + metaPermission.getObject());
// return;
// }
// // достаем все поля, на кот-е нужно дать разрешения
// List<MetaField> metaFields = scriptFindByModel(metaModel);
// updateMetaPermissionRules(metaPermission, metaFields);
// }
private void processMetaPermission(MetaPermission metaPermission, MetaField metaField) {
// Получаем модель
MetaModel metaModel = findMetaModelByName(metaPermission.getObject());
if (metaModel == null) {
logger.warning("MetaModel not found for MetaPermission object: " + metaPermission.getObject());
return;
}

// Обновляем правила разрешений
updateMetaPermissionRules(metaPermission, metaField);
}
private static final Logger logger = Logger.getLogger(FieldServiceImpl.class.getName());

private final MetaModelRepository metaModelRepository;
private final MetaPermissionRuleRepository metaPermissionRuleRepository;
private final MetaPermissionRepository metaPermissionRepository;
private final PermissionRepository permissionRepository;

@Inject
public FieldServiceImpl(
MetaModelRepository metaModelRepository,
MetaPermissionRuleRepository metaPermissionRuleRepository,
MetaPermissionRepository metaPermissionRepository,
PermissionRepository permissionRepository) {
this.metaModelRepository = metaModelRepository;
this.metaPermissionRuleRepository = metaPermissionRuleRepository;
this.metaPermissionRepository = metaPermissionRepository;
this.permissionRepository = permissionRepository;
}

private MetaModel findMetaModelByName(String name) {
return metaModelRepository.all().filter("self.fullName = :name").bind("name", name).fetchOne();
}

// private void updateMetaPermissionRules(
// MetaPermission metaPermission, List<MetaField> metaFields) {
// Set<MetaPermissionRule> existingRules = new HashSet<>(metaPermission.getRules());
// logger.info("existingRules: " + existingRules);
// int counter = 0;
//
// for (MetaField metaField : metaFields) {
// if (!metaPermissionRuleExists(metaPermission, metaField) && metaField.getGenerate() == true) {
// MetaPermissionRule newRule = buildMetaPermissionRule(metaField, metaPermission);
// MetaPermissionRule savedRule = metaPermissionRuleRepository.save(newRule);
// counter += 1;
// logger.info("MetaPermissionRule saved: " + savedRule.getId());
// existingRules.add(savedRule);
// }
// }
// logger.info("Saved metaPermissionRule amount: " + counter);
//
// metaPermission.getRules().clear();
// logger.info("existingRules after if: " + existingRules);
// metaPermission.getRules().addAll(existingRules);
//
// MetaPermission savedMetaPermission = metaPermissionRepository.save(metaPermission);
// logger.info("MetaPermission saved: " + savedMetaPermission.getName());
// }
private void updateMetaPermissionRules(MetaPermission metaPermission, MetaField metaField) {
Set<MetaPermissionRule> existingRules = new HashSet<>(metaPermission.getRules());
logger.info("existingRules: " + existingRules);
int counter = 0;

if (!metaPermissionRuleExists(metaPermission, metaField)) {
MetaPermissionRule newRule = buildMetaPermissionRule(metaField, metaPermission);
MetaPermissionRule savedRule = metaPermissionRuleRepository.save(newRule);
counter += 1;
logger.info("MetaPermissionRule saved: " + savedRule.getId());
existingRules.add(savedRule);
}
logger.info("Saved metaPermissionRule amount: " + counter);

metaPermission.getRules().clear();
metaPermission.getRules().addAll(existingRules);

MetaPermission savedMetaPermission = metaPermissionRepository.save(metaPermission);
logger.info("MetaPermission saved: " + savedMetaPermission.getName());
}
@Override
public void generateMetaPermissionRules(List<MetaModel> models) {
if (models == null) {
logger.severe("models list is null");
return;
}

models.forEach(metaModel -> {
if (metaModel == null) {
logger.warning("metaModel is null in models list");
return;
}

List<MetaField> metaFields = scriptFindByModel(metaModel);
if (metaFields == null || metaFields.isEmpty()) {
logger.warning("No MetaFields found for MetaModel: " + metaModel.getFullName());
return;
}

for (MetaField metaField : metaFields) {
if (metaField == null) {
logger.warning("metaField is null in metaFields list for MetaModel: " + metaModel.getFullName());
continue;
}

if (metaField.getGenerate()) {
System.out.println(metaField.getName());
List<MetaPermission> metaPermissions = metaPermissionRepository.all().fetch();
if (metaPermissions == null || metaPermissions.isEmpty()) {
logger.warning("No MetaPermissions found");
continue;
}

metaPermissions.forEach(metaPermission -> {
if (metaPermission == null) {
logger.warning("metaPermission is null in metaPermissions list");
return;
}

processMetaPermission(metaPermission, metaField);
});
}
}
});
}

private void processMetaPermission(MetaPermission metaPermission, MetaField metaField) {
MetaModel metaModel = findMetaModelByName(metaPermission.getObject());
if (metaModel == null) {
logger.warning("MetaModel not found for MetaPermission object: " + metaPermission.getObject());
return;
}

updateMetaPermissionRules(metaPermission, metaField);
}

private MetaModel findMetaModelByName(String name) {
return metaModelRepository.all().filter("self.fullName = :name").bind("name", name).fetchOne();
}

private void updateMetaPermissionRules(MetaPermission metaPermission, MetaField metaField) {
Set<MetaPermissionRule> existingRules = new HashSet<>(metaPermission.getRules());
logger.info("existingRules: " + existingRules);
int counter = 0;

if (!metaPermissionRuleExists(metaPermission, metaField)) {
MetaPermissionRule newRule = buildMetaPermissionRule(metaField, metaPermission);
MetaPermissionRule savedRule = metaPermissionRuleRepository.save(newRule);
counter += 1;
logger.info("MetaPermissionRule saved: " + savedRule.getId());
existingRules.add(savedRule);
}
logger.info("Saved metaPermissionRule amount: " + counter);

metaPermission.getRules().clear();
metaPermission.getRules().addAll(existingRules);

MetaPermission savedMetaPermission = metaPermissionRepository.save(metaPermission);
logger.info("MetaPermission saved: " + savedMetaPermission.getName());
}

private MetaPermissionRule buildMetaPermissionRule(
MetaField metaField, MetaPermission metaPermission) {
MetaPermissionRule metaPermissionRule = new MetaPermissionRule();
metaPermissionRule.setField(metaField.getName());
metaPermissionRule.setCanRead(true);
metaPermissionRule.setCanExport(true);
metaPermissionRule.setCanWrite(true);
metaPermissionRule.setMetaPermission(metaPermission);
return metaPermissionRule;
}

private boolean metaPermissionRuleExists(MetaPermission metaPermission, MetaField metaField) {
return metaPermission.getRules().stream()
.anyMatch(rule -> rule.getField().equals(metaField.getName()));
}

// раздает пермишен для каждого поля
private MetaPermissionRule buildMetaPermissionRule(
MetaField metaField, MetaPermission metaPermission) {
MetaPermissionRule metaPermissionRule = new MetaPermissionRule();
metaPermissionRule.setField(metaField.getName());
metaPermissionRule.setCanRead(true);
metaPermissionRule.setCanExport(true);
metaPermissionRule.setCanWrite(true);
metaPermissionRule.setMetaPermission(metaPermission);
return metaPermissionRule;
}

// проверяет есть существует ли пермишен для поля
private boolean metaPermissionRuleExists(MetaPermission metaPermission, MetaField metaField) {
return metaPermission.getRules().stream()
.anyMatch(rule -> rule.getField().equals(metaField.getName()));
}

// достает все поля модели
private List<MetaField> scriptFindByModel(MetaModel metaModel) {
if (metaModel == null) {
logger.severe("metaModel cannot be null");
throw new IllegalArgumentException("metaModel cannot be null");
private List<MetaField> scriptFindByModel(MetaModel metaModel) {
if (metaModel == null) {
logger.severe("metaModel cannot be null");
throw new IllegalArgumentException("metaModel cannot be null");
}
return metaModel.getMetaFields();
}
return Query.of(MetaField.class)
.filter("self.relationship IS NULL AND self.metaModel = :metaModel")
.bind("metaModel", metaModel)
.fetch();
}
}
53 changes: 23 additions & 30 deletions src/main/java/com/axelor/script/web/FieldController.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,49 +9,42 @@
import com.google.inject.persist.Transactional;
import java.util.Set;
import java.util.Map;
import java.util.ArrayList;
import java.util.LinkedHashMap;

import java.util.List;
import com.fasterxml.jackson.databind.ObjectMapper;

@Singleton
public class FieldController {

private final FieldService fieldService;
private List<MetaModel> model;
private final ObjectMapper objectMapper;

@Inject
public FieldController(FieldService fieldService) {
public FieldController(FieldService fieldService, ObjectMapper objectMapper) {
this.fieldService = fieldService;
this.objectMapper = objectMapper;
}

@Transactional
public void generateField(ActionRequest request, ActionResponse response) {
// List<MetaModel> models = (List<MetaModel>) request.getContext().get("model");
// for (MetaModel model : models) {
// for (int j = 0; j < model.getMetaFields().size(); j++) {
// ((ActionRequest) request).getData().get("context")
// .entrySet().toArray()[3].getValue().get(models.indexOf(model)) //model -> name
// .entrySet().toArray()[3].getValue().get(j) //field -> name
// .entrySet().toArray()[5].getValue(); //field -> generate
// }
// }

// Получаем entrySet
Set<Map.Entry<String, Object>> entrySet = request.getContext().entrySet();

// Преобразуем entrySet в массив Map.Entry
Map.Entry<String, List<MetaModel>>[] entries = entrySet.toArray(new Map.Entry[0]);

// Получаем 5-й элемент (с индексом 4)
Map.Entry<String, List<MetaModel>> entry = entries[4];
System.out.println("Entry value: " + entry.getValue());
//LinkedHashMap<String, MetaModel> entryVal = entry.getValue();

// Получаем значение из этого элемента (должен быть список List<MetaModel>)
List<MetaModel> models = (List<MetaModel>) entry;


fieldService.generateMetaPermissionRules(models);
Map.Entry<String, Object>[] entries = entrySet.toArray(new Map.Entry[0]);

if (entries.length > 4) {
Map.Entry<String, Object> entry = entries[4];

Object value = entry.getValue();
if (value instanceof List<?>) {
try {
List<?> valueList = (List<?>) value;
List<MetaModel> models = objectMapper.convertValue(valueList, objectMapper.getTypeFactory().constructCollectionType(List.class, MetaModel.class));

fieldService.generateMetaPermissionRules(models);
} catch (Exception e) {
e.printStackTrace();
}
} else {
}
} else {
}
}
}

0 comments on commit f661ad5

Please sign in to comment.