def edit_publication(publication=None):
    form = PublicationUploadForm(obj=publication)

    if publication:
        ensureEditable(publication)

    if form.validate_on_submit():
        if not publication:
            publication = Publication(author_id=current_user.id,
                                      url_slug=generate_slug(form.title.data))
            db.session.add(publication)
        publication.title = form.title.data
        publication.pub_year = form.pub_year.data
        publication.authors = form.authors.data
        publication.journal = form.journal.data
        publication.link = form.link.data
        publication.abstract = form.abstract.data
        publication.published = True

        for file in form.files.data:
            if file == '':
                continue
            f = File.fromUpload(file)
            db.session.add(f)
            publication.files.append(Attachment(file=f, name=file.filename))

        db.session.commit()

        return redirect(url_for('edit_publication', publication=publication))

    data = {
        'publication': publication.serialize() if publication else None,
        'form': form.serialize(),
        'csrf_token': g.csrf_token
    }

    return render_vue(data,
                      title='Edit' if publication else 'Create',
                      menu='publications')