Search in sources :

Example 21 with Contributor

use of ai.elimu.model.Contributor in project webapp by elimu-ai.

the class WordCreateController method handleSubmit.

@RequestMapping(method = RequestMethod.POST)
public String handleSubmit(HttpSession session, @Valid Word word, BindingResult result, Model model) {
    logger.info("handleSubmit");
    Word existingWord = wordDao.readByText(word.getLocale(), word.getText());
    if (existingWord != null) {
        result.rejectValue("text", "NonUnique");
    }
    Contributor contributor = (Contributor) session.getAttribute("contributor");
    List<Allophone> allophones = allophoneDao.readAllOrderedByUsage(contributor.getLocale());
    // Verify that only valid Allophones are used
    String allAllophonesCombined = "";
    for (Allophone allophone : allophones) {
        allAllophonesCombined += allophone.getValueIpa();
    }
    if (StringUtils.isNotBlank(word.getPhonetics())) {
        for (char allophoneCharacter : word.getPhonetics().toCharArray()) {
            String allophone = String.valueOf(allophoneCharacter);
            if (!allAllophonesCombined.contains(allophone)) {
                result.rejectValue("phonetics", "Invalid");
                break;
            }
        }
    }
    if (result.hasErrors()) {
        model.addAttribute("word", word);
        model.addAttribute("allophones", allophones);
        model.addAttribute("wordTypes", WordType.values());
        model.addAttribute("spellingConsistencies", SpellingConsistency.values());
        return "content/word/create";
    } else {
        if (!"I".equals(word.getText())) {
            word.setText(word.getText().toLowerCase());
        }
        word.setTimeLastUpdate(Calendar.getInstance());
        wordDao.create(word);
        WordRevisionEvent wordRevisionEvent = new WordRevisionEvent();
        wordRevisionEvent.setContributor(contributor);
        wordRevisionEvent.setCalendar(Calendar.getInstance());
        wordRevisionEvent.setWord(word);
        wordRevisionEvent.setText(word.getText());
        wordRevisionEvent.setPhonetics(word.getPhonetics());
        wordRevisionEventDao.create(wordRevisionEvent);
        // Label Image with Word of matching title
        Image matchingImage = imageDao.read(word.getText(), word.getLocale());
        if (matchingImage != null) {
            Set<Word> labeledWords = matchingImage.getWords();
            if (!labeledWords.contains(word)) {
                labeledWords.add(word);
                matchingImage.setWords(labeledWords);
                imageDao.update(matchingImage);
            }
        }
        // Delete syllables that are actual words
        Syllable syllable = syllableDao.readByText(contributor.getLocale(), word.getText());
        if (syllable != null) {
            syllableDao.delete(syllable);
        }
        if (EnvironmentContextLoaderListener.env == Environment.PROD) {
            String text = URLEncoder.encode(contributor.getFirstName() + " just added a new Word:\n" + "• Language: \"" + word.getLocale().getLanguage() + "\"\n" + "• Text: \"" + word.getText() + "\"\n" + "• Phonetics (IPA): /" + word.getPhonetics() + "/\n" + "• Word type: " + word.getWordType() + "\n" + "• Spelling consistency: " + word.getSpellingConsistency() + "\n" + "See ") + "http://elimu.ai/content/word/edit/" + word.getId();
            String iconUrl = contributor.getImageUrl();
            SlackApiHelper.postMessage(SlackApiHelper.getChannelId(Team.CONTENT_CREATION), text, iconUrl, null);
        }
        return "redirect:/content/word/list#" + word.getId();
    }
}
Also used : Word(ai.elimu.model.content.Word) Allophone(ai.elimu.model.content.Allophone) Contributor(ai.elimu.model.Contributor) WordRevisionEvent(ai.elimu.model.contributor.WordRevisionEvent) Image(ai.elimu.model.content.multimedia.Image) Syllable(ai.elimu.model.content.Syllable) RequestMapping(org.springframework.web.bind.annotation.RequestMapping)

Example 22 with Contributor

use of ai.elimu.model.Contributor in project webapp by elimu-ai.

the class WordCreateController method handleRequest.

@RequestMapping(method = RequestMethod.GET)
public String handleRequest(Model model, HttpSession session) {
    logger.info("handleRequest");
    Word word = new Word();
    model.addAttribute("word", word);
    Contributor contributor = (Contributor) session.getAttribute("contributor");
    List<Allophone> allophones = allophoneDao.readAllOrderedByUsage(contributor.getLocale());
    model.addAttribute("allophones", allophones);
    model.addAttribute("wordTypes", WordType.values());
    model.addAttribute("spellingConsistencies", SpellingConsistency.values());
    return "content/word/create";
}
Also used : Word(ai.elimu.model.content.Word) Allophone(ai.elimu.model.content.Allophone) Contributor(ai.elimu.model.Contributor) RequestMapping(org.springframework.web.bind.annotation.RequestMapping)

Example 23 with Contributor

use of ai.elimu.model.Contributor in project webapp by elimu-ai.

the class ProjectListController method handleListRequest.

@RequestMapping(value = "/list", method = RequestMethod.GET)
public String handleListRequest(Model model, HttpSession session) {
    logger.info("handleListRequest");
    Contributor contributor = (Contributor) session.getAttribute("contributor");
    List<Project> projects = projectDao.read(contributor);
    if (EnvironmentContextLoaderListener.env == Environment.DEV) {
        if (projects.isEmpty()) {
            // To ease development, auto-generate Projects
            projects = generateProjects(contributor);
        }
    }
    model.addAttribute("projects", projects);
    return "project/list";
}
Also used : Project(ai.elimu.model.project.Project) Contributor(ai.elimu.model.Contributor) RequestMapping(org.springframework.web.bind.annotation.RequestMapping)

Example 24 with Contributor

use of ai.elimu.model.Contributor in project webapp by elimu-ai.

the class AppCreateController method handleSubmit.

@RequestMapping(method = RequestMethod.POST)
public String handleSubmit(ApplicationVersion applicationVersion, @RequestParam("bytes") MultipartFile multipartFile, BindingResult result, Model model, HttpSession session, @PathVariable Long appGroupId, @PathVariable Long projectId, @PathVariable Long appCategoryId) {
    logger.info("handleSubmit");
    Project project = projectDao.read(projectId);
    AppCategory appCategory = appCategoryDao.read(appCategoryId);
    AppGroup appGroup = appGroupDao.read(appGroupId);
    boolean isUpdateOfExistingApplication = applicationVersion.getApplication() != null;
    logger.info("isUpdateOfExistingApplication: " + isUpdateOfExistingApplication);
    Contributor contributor = (Contributor) session.getAttribute("contributor");
    String packageName = null;
    if (multipartFile.isEmpty()) {
        result.rejectValue("bytes", "NotNull");
    } else {
        try {
            byte[] bytes = multipartFile.getBytes();
            Integer fileSizeInKb = bytes.length / 1024;
            logger.info("fileSizeInKb: " + fileSizeInKb + " (" + (fileSizeInKb / 1024) + "MB)");
            String contentType = multipartFile.getContentType();
            logger.info("contentType: " + contentType);
            // Auto-detect applicationId, versionCode, etc.
            ByteArrayApkFile byteArrayApkFile = new ByteArrayApkFile(bytes);
            ApkMeta apkMeta = byteArrayApkFile.getApkMeta();
            packageName = apkMeta.getPackageName();
            logger.info("packageName: " + packageName);
            String label = apkMeta.getLabel();
            logger.info("label: " + label);
            byte[] icon = byteArrayApkFile.getIconFile().getData();
            logger.info("icon.length: " + (icon.length / 1024) + "kB");
            Integer versionCode = apkMeta.getVersionCode().intValue();
            logger.info("versionCode: " + versionCode);
            String versionName = apkMeta.getVersionName();
            logger.info("versionName: " + versionName);
            Integer minSdkVersion = Integer.valueOf(apkMeta.getMinSdkVersion());
            logger.info("minSdkVersion: " + minSdkVersion);
            // Check if Application already exists in the same AppCategory
            // TODO
            applicationVersion.setBytes(bytes);
            applicationVersion.setFileSizeInKb(fileSizeInKb);
            applicationVersion.setChecksumMd5(ChecksumHelper.calculateMD5(bytes));
            applicationVersion.setContentType(contentType);
            applicationVersion.setVersionCode(versionCode);
            applicationVersion.setVersionName(versionName);
            applicationVersion.setLabel(label);
            applicationVersion.setMinSdkVersion(minSdkVersion);
            applicationVersion.setIcon(icon);
            applicationVersion.setTimeUploaded(Calendar.getInstance());
            applicationVersion.setContributor(contributor);
            if (isUpdateOfExistingApplication) {
                // Verify that the packageName of the APK update matches that of the Application
                if (!applicationVersion.getApplication().getPackageName().equals(packageName)) {
                    result.rejectValue("application", "NonUnique");
                }
            }
            if (!isUpdateOfExistingApplication) {
                // Verify that an Application with identical packageName has not already been uploaded withing the same Project
                Application existingApplication = applicationDao.readByPackageName(project, packageName);
                if (existingApplication != null) {
                    result.rejectValue("application", "NonUnique", new String[] { "application" }, null);
                }
            }
            if (isUpdateOfExistingApplication) {
                // Verify that the versionCode is higher than previous ones
                List<ApplicationVersion> existingApplicationVersions = applicationVersionDao.readAll(applicationVersion.getApplication());
                for (ApplicationVersion existingApplicationVersion : existingApplicationVersions) {
                    if (existingApplicationVersion.getVersionCode() >= applicationVersion.getVersionCode()) {
                        result.rejectValue("versionCode", "TooLow");
                        break;
                    }
                }
            }
        } catch (IOException ex) {
            logger.error(ex);
        }
    }
    if (result.hasErrors()) {
        model.addAttribute("project", project);
        model.addAttribute("appCategory", appCategory);
        model.addAttribute("appGroup", appGroup);
        return "project/app/create";
    } else {
        Application application = applicationVersion.getApplication();
        logger.info("application: " + application);
        if (application == null) {
            // First-time upload for packageName
            // Create new Application
            application = new Application();
            // TODO: Add Locale to each Project?
            application.setLocale(contributor.getLocale());
            application.setPackageName(packageName);
            application.setApplicationStatus(ApplicationStatus.MISSING_APK);
            application.setContributor(contributor);
            application.setProject(project);
            applicationDao.create(application);
            appGroup.getApplications().add(application);
            appGroupDao.update(appGroup);
            applicationVersion.setApplication(application);
            applicationVersionDao.create(applicationVersion);
            application.setApplicationStatus(ApplicationStatus.ACTIVE);
            applicationDao.update(application);
        } else {
            // Update of existing packageName previously uploaded
            // Create new ApplicationVersion for the existing Application
            applicationVersionDao.create(applicationVersion);
        }
        // Refresh REST API cache
        // jsonService.refreshApplicationsInAppCollection(appCollection);
        jsonService.refreshApplicationsInAppCollection();
        if (EnvironmentContextLoaderListener.env == Environment.PROD) {
            String applicationDescription = !isUpdateOfExistingApplication ? "Application" : "APK version";
            String text = URLEncoder.encode(contributor.getFirstName() + " just uploaded a new " + applicationDescription + ":\n" + "• Project: \"" + project.getName() + "\"\n" + "• App Category: \"" + appCategory.getName() + "\"\n" + "• Package name: \"" + application.getPackageName() + "\"\n" + "• Version code: " + applicationVersion.getVersionCode() + "\n" + "See ") + "http://elimu.ai/project/" + project.getId() + "/app-category/" + appCategory.getId() + "/app-group/" + appGroup.getId() + "/app/" + application.getId() + "/edit";
            SlackApiHelper.postMessage("G6UR7UH2S", text, null, null);
        }
        if (!isUpdateOfExistingApplication) {
            return "redirect:/project/{projectId}/app-category/{appCategoryId}/app-group/{appGroupId}/app/list#" + application.getId();
        } else {
            return "redirect:/project/{projectId}/app-category/{appCategoryId}/app-group/{appGroupId}/app/" + application.getId() + "/edit";
        }
    }
}
Also used : ApplicationVersion(ai.elimu.model.admin.ApplicationVersion) Contributor(ai.elimu.model.Contributor) IOException(java.io.IOException) Project(ai.elimu.model.project.Project) ByteArrayApkFile(net.dongliu.apk.parser.ByteArrayApkFile) AppGroup(ai.elimu.model.project.AppGroup) ApkMeta(net.dongliu.apk.parser.bean.ApkMeta) Application(ai.elimu.model.admin.Application) AppCategory(ai.elimu.model.project.AppCategory) RequestMapping(org.springframework.web.bind.annotation.RequestMapping)

Example 25 with Contributor

use of ai.elimu.model.Contributor in project webapp by elimu-ai.

the class AppEditController method handleSubmit.

@RequestMapping(method = RequestMethod.POST)
public String handleSubmit(@PathVariable Long projectId, @PathVariable Long appCategoryId, @PathVariable Long appGroupId, @PathVariable Long applicationId, HttpSession session, @Valid Application application, BindingResult result, Model model) {
    logger.info("handleSubmit");
    Project project = projectDao.read(projectId);
    model.addAttribute("project", project);
    AppCategory appCategory = appCategoryDao.read(appCategoryId);
    model.addAttribute("appCategory", appCategory);
    AppGroup appGroup = appGroupDao.read(appGroupId);
    model.addAttribute("appGroup", appGroup);
    if (result.hasErrors()) {
        model.addAttribute("application", application);
        List<ApplicationVersion> applicationVersions = applicationVersionDao.readAll(application);
        model.addAttribute("applicationVersions", applicationVersions);
        model.addAttribute("applicationStatuses", ApplicationStatus.values());
        return "project/app/edit";
    } else {
        applicationDao.update(application);
        if (application.getApplicationStatus() == ApplicationStatus.DELETED) {
            // Delete corresponding ApplicationVersions
            List<ApplicationVersion> applicationVersions = applicationVersionDao.readAll(application);
            for (ApplicationVersion applicationVersion : applicationVersions) {
                applicationVersionDao.delete(applicationVersion);
            }
            // Refresh REST API cache
            // jsonService.refreshApplicationsInAppCollection(appCollection);
            jsonService.refreshApplicationsInAppCollection();
            if (EnvironmentContextLoaderListener.env == Environment.PROD) {
                // Notify project members in Slack
                Contributor contributor = (Contributor) session.getAttribute("contributor");
                String text = URLEncoder.encode(contributor.getFirstName() + " just deleted an Application:\n" + "• Project: \"" + project.getName() + "\"\n" + "• App Category: \"" + appCategory.getName() + "\"\n" + "• Package name: \"" + application.getPackageName() + "\"\n" + "See ") + "http://elimu.ai/project/" + project.getId() + "/app-category/" + appCategory.getId() + "/app-group/" + appGroup.getId() + "/app/" + application.getId() + "/edit";
                SlackApiHelper.postMessage("G6UR7UH2S", text, null, null);
            }
        }
        return "redirect:/project/" + projectId + "/app-category/" + appCategoryId + "/app-group/" + appGroupId + "/app/list";
    }
}
Also used : Project(ai.elimu.model.project.Project) ApplicationVersion(ai.elimu.model.admin.ApplicationVersion) Contributor(ai.elimu.model.Contributor) AppGroup(ai.elimu.model.project.AppGroup) AppCategory(ai.elimu.model.project.AppCategory) RequestMapping(org.springframework.web.bind.annotation.RequestMapping)

Aggregations

Contributor (ai.elimu.model.Contributor)57 RequestMapping (org.springframework.web.bind.annotation.RequestMapping)51 Project (ai.elimu.model.project.Project)12 IOException (java.io.IOException)10 Allophone (ai.elimu.model.content.Allophone)9 Word (ai.elimu.model.content.Word)8 Image (ai.elimu.model.content.multimedia.Image)8 Audio (ai.elimu.model.content.multimedia.Audio)6 Letter (ai.elimu.model.content.Letter)5 Number (ai.elimu.model.content.Number)5 AppCategory (ai.elimu.model.project.AppCategory)5 StoryBook (ai.elimu.model.content.StoryBook)4 Video (ai.elimu.model.content.multimedia.Video)4 Scheduled (org.springframework.scheduling.annotation.Scheduled)4 AppCollection (ai.elimu.model.project.AppCollection)3 AppGroup (ai.elimu.model.project.AppGroup)3 Locale (java.util.Locale)3 Application (ai.elimu.model.admin.Application)2 ApplicationVersion (ai.elimu.model.admin.ApplicationVersion)2 Syllable (ai.elimu.model.content.Syllable)2