示例#1
0
def add_blob_content():

    response_object = {
      'status': 'success',
      'now': datetime.utcnow().isoformat(),
      'filelink': None,
    }

    folder = Folder.retrieve_by_id(3001)
    if not folder:
        response_object['status'] = 'failure'
        return util.jsonpify(response_object)
    upload_files = get_uploads(flask.request, 'file')
    if len(upload_files):
        blob_info = upload_files[0]
        if blob_info.size:
            f = File.create(
                blob_info.key(),
                size=blob_info.size,
                filename=os.path.basename(blob_info.filename.replace('\\','/')),
                content_type=blob_info.content_type)
            f.put()
            if f.get_cached_url():
                folder.files.append(f.key)
                folder.put()
                response_object['filelink'] = f.get_cached_url()
        else:
            blob_info.delete()
    return util.jsonpify(response_object)
示例#2
0
def preview_newsletter(request, key):
    newsletter = Newsletter.get(key)
    gifts = []
    if newsletter.gifts:
        gifts_split = newsletter.gifts.split(",")
        for gift in gifts_split:
            try:
                gift = gift.strip()
                obj = Gift.all().filter("uid =", gift).get()
                if obj:
                    gifts.append(obj)
            except Exception:
                pass
    managers = []
    users = UserProfile.all().filter("is_send_newsletter =", True).filter("email !=", None)
    if newsletter.type != 999:
        users = users.filter("newsletter_type =", newsletter.type)

    files = []
    for file_key in newsletter.n_price_list:
        file_ = File.get(file_key)
        if file_:
            files.append(file_)
    return render_to_response(
        "postman/admin/newsletters/preview.html",
        {"newsletter": newsletter, "gifts": gifts, "key": key, "files": files, "managers": managers, "users": users},
    )
示例#3
0
def upload_price():
    form = PriceFileForm()
    if request.method == 'POST' and form.validate_on_submit():
        upload_files = get_uploads(request, 'attach_file_')
        if len(upload_files):
            blob_info = upload_files[0]
            if blob_info.size:
                price_file = PriceFile()
                form.populate_obj(price_file)
                file_ = File.create(blob_info.key(),
                                    size=blob_info.size,
                                    filename=os.path.basename(
                                        blob_info.filename.replace('\\', '/')),
                                    content_type=blob_info.content_type,
                                    is_public=True,
                                    description=form.description.data)
                file_.put()
                price_file.file = file_.key
                price_file.put()
            else:
                blob_info.delete()
        return redirect(url_for('admin.price.index'))
    prices = PriceFile.query().order(-PriceFile.order_id)
    return render_template('admin/price/index.html',
                           prices=prices,
                           form=form,
                           upload_url=blobstore.create_upload_url(
                               url_for('admin.price.upload_price')))
示例#4
0
文件: views.py 项目: gmist/solostyle
def get_file_w_name(file_key, name):
    file = File.query(File.uid==file_key).get()
    if not file or not file.blob_key:
        return render_template('file/not_found.html')
    if not _check_owner(file):
        return render_template('file/is_private.html')
    return send_blob(file.blob_key, content_type=file.content_type)
示例#5
0
文件: views.py 项目: gmist/3dhero.ru
def upload_price():
    form = PriceFileForm()
    if request.method == 'POST' and form.validate_on_submit():
        upload_files = get_uploads(request, 'attach_file_')
        if len(upload_files):
            blob_info = upload_files[0]
            if blob_info.size:
                price_file = PriceFile()
                form.populate_obj(price_file)
                file_ = File.create(
                    blob_info.key(),
                    size=blob_info.size,
                    filename=os.path.basename(blob_info.filename.replace('\\','/')),
                    content_type=blob_info.content_type,
                    is_public=True,
                    description = form.description.data
                )
                file_.put()
                price_file.file = file_.key
                price_file.put()
            else:
                blob_info.delete()
        return redirect(url_for('admin.price.index'))
    prices = PriceFile.query().order(-PriceFile.order_id)
    return render_template(
        'admin/price/index.html',
        prices=prices,
        form=form,
        upload_url=blobstore.create_upload_url(url_for('admin.price.upload_price'))
    )
示例#6
0
文件: views.py 项目: gmist/solostyle
def upload_resume(key_id):
    job = Job.retrieve_by_id(key_id)
    if not job or not job.is_public:
        return redirect(url_for('about.jobs'))
    form = ResumeForm()
    if request.method == 'POST' and form.validate_on_submit():
        resume = Resume()
        form.populate_obj(resume)
        resume.vacancy = job.key
        upload_files = get_uploads(request, 'attach_file_')
        if len(upload_files):
            blob_info = upload_files[0]
            if blob_info.size:
                file_ = File.create(
                    blob_info.key(),
                    size=blob_info.size,
                    filename=os.path.basename(blob_info.filename.replace('\\','/')),
                    content_type=blob_info.content_type)
                file_.put()
                resume.attach_file = file_.key
            else:
                blob_info.delete()
        resume.put()
        return render_template('about/resume_thanks.html', html_class='about_class')
    upload_url = blobstore.create_upload_url(url_for('about.upload_resume', key_id=key_id))
    return render_template(
        'about/job.html',
        html_class='about_page',
        job=job,
        form=form,
        upload_url=upload_url,
        is_send_form=True
    )
示例#7
0
def get_file(file_key):
    file = File.query(File.uid==file_key).get()
    if not file or not file.blob_key:
        return render_template('file/not_found.html')
    if file.title_filename:
        return redirect(url_for('file.get_w_name',
            file_key=file_key, name=file.title_filename))
    return send_blob(file.blob_key, content_type=file.content_type)
示例#8
0
文件: views.py 项目: gmist/1businka
def get_responce(f_key, f_name, save_as=False):
    file_ = File.get_by_id(f_key)
    if file_ and file_.blob:
        bi = BlobInfo(file_.blob)
        if save_as:
            return send_blob(file_.blob, content_type=bi.content_type, save_as=f_name)
        return send_blob(file_.blob, content_type=bi.content_type)
    return Response(status=404)
示例#9
0
文件: admins.py 项目: gmist/solostyle
def employee_add():
    form = EmployeeForm(request.form)

    upload_files = get_uploads(request, 'photo_file')
    file_ = None
    if len(upload_files):
        blob_info = upload_files[0]
    else:
        blob_info = None

    if form.validate_on_submit():
        if blob_info:
            blob_info = blobstore.BlobInfo.get(blob_info.key())
            if blob_info.size:
                file_ = File.create(
                    blob_key=blob_info.key(),
                    title=form.name.data,
                    description=form.description.data,
                    is_public=form.is_public.data,
                    filename=os.path.basename(blob_info.filename.replace('\\', '/')),
                    size=blob_info.size,
                    content_type=blob_info.content_type)
                file_.put()
            else:
                blob_info.delete()

        employee = Employee()
        employee.name = form.name.data
        employee.post = form.post.data
        employee.description = form.description.data
        employee.is_public = form.is_public.data

        employee.telephone = form.telephone.data
        employee.telephone_m = form.telephone_m.data
        employee.email = form.email.data
        employee.icq = form.icq.data
        employee.skype = form.skype.data

        employee.country = form.country.data
        employee.city = form.city.data
        employee.address = form.address.data

        if file_:
            employee.photo_key = file_.key
        employee.put()
        return redirect(url_for('about.admins.employee'))

    else:
        if blob_info:
            blob_info.delete()

    add_url = blobstore.create_upload_url(url_for('about.admins.employee_add'))
    return render_template(
        'about/admins/employee/add.html',
        form=form,
        add_url=add_url
    )
示例#10
0
def get_file_w_name(request, file_key, name):
    file = File.all().filter("uid =", file_key)
    if file.count():
        file = file.get()
    else:
        file = None
    if not file or not file.blob_key:
        return render_to_response("file/not_found.html")
    return send_blob(file.blob_key, content_type=file.content_type)
示例#11
0
def get_file(file_key):
    file_ = File.query(File.uid == file_key).get()
    if not file_ or not file_.blob_key:
        return render_template('file/not_found.html')
    if file_.title_filename:
        return redirect(
            url_for('file.get_w_name',
                    file_key=file_key,
                    name=file_.title_filename))
    if not _check_owner(file_):
        return render_template('file/is_private.html')
    return send_blob(file_.blob_key, content_type=file_.content_type)
示例#12
0
文件: views.py 项目: gmist/3dhero.ru
def get_file(file_key):
    file_ = File.query(File.uid == file_key).get()
    if not file_ or not file_.blob_key:
        return render_template('file/not_found.html')
    if file_.title_filename:
        return redirect(
            url_for(
                'file.get_w_name', file_key=file_key, name=file_.title_filename)
        )
    if not _check_owner(file_):
            return render_template('file/is_private.html')
    return send_blob(file_.blob_key, content_type=file_.content_type)
示例#13
0
def add_newsletter_file(request, key):
    newsletter = Newsletter.get(key)
    url = blobstore.create_upload_url(url_for("admin/add_newsletter_file", key=key))
    form = NewsletterFileForm(action=url)
    form.csrf_protected = False
    if request.method == "POST" and form.validate(request.form):
        upload_files = get_uploads(request, "file")
        if not len(upload_files):
            return redirect(url_for("admin/add_newsletter_file", key=key))
        blob_info = upload_files[0]
        bl = blobstore.BlobInfo.get(blob_info.key())
        filename = os.path.basename(bl.filename.replace("\\", "/"))
        file_ = File(
            filename=filename, content_type=blob_info.content_type, blob_key=str(blob_info.key()), length=blob_info.size
        )
        file_.put()
        newsletter.n_price_list.append(str(file_.key()))
        newsletter.put()
        return redirect(url_for("admin/edit_newsletter", key=key))
    return render_to_response(
        "postman/admin/newsletters/add_file.html", {"form": form.as_widget(), "newsletter": newsletter, "key": key}
    )
示例#14
0
def delete_newsletter_file(request, key, file_key):
    if request.method == "POST":
        newsletter = Newsletter.get(key)
        if not newsletter:
            return redirect("/admin/postman/newsletters/")
        for i, file_key_ in enumerate(newsletter.n_price_list):
            if file_key_ == file_key_:
                file = File.get(file_key)
                if file:
                    file.delete()
                del newsletter.n_price_list[i]
                newsletter.put()
                break
    return redirect(url_for("admin/edit_newsletter", key=key))
示例#15
0
def delete_file2(request, key_id, file_key_id):
    if request.method == "POST":
        newsletter = Newsletter2.get_by_id(key_id)
        if not newsletter:
            return redirect("postman/admin/newsletters2")
        for i, file_key_ in enumerate(newsletter.n_price_list):
            if file_key_ == file_key_:
                file = File.get_by_id(file_key_id)
                if file:
                    file.delete()
                del newsletter.n_price_list[i]
                newsletter.put()
                break
    return redirect(url_for("postman/admin/newsletters2/edit", key_id=key_id))
示例#16
0
文件: admins.py 项目: gmist/solostyle
def employee_upload(key_id):
    employee = Employee.retrieve_by_id(key_id)
    if not employee:
        return redirect(url_for('about.admins.employee'))

    if 'delete_contact' in request.form:
        employee.key.delete()
        return redirect(url_for('about.admins.employee'))

    upload_files = get_uploads(request, 'photo_file')
    file_ = None
    if len(upload_files):
        blob_info = upload_files[0]
    else:
        blob_info = None

    form = EmployeeForm()
    if form.validate_on_submit():
        if blob_info:
            blob_info = blobstore.BlobInfo.get(blob_info.key())
            if blob_info.size:
                file_ = File.create(
                    blob_key=blob_info.key(),
                    title=form.name.data,
                    description=form.description.data,
                    is_public=form.is_public.data,
                    filename=os.path.basename(blob_info.filename.replace('\\', '/')),
                    size=blob_info.size,
                    content_type=blob_info.content_type)
                file_ = file_.put_async()
            else:
                blob_info.delete()

        form.populate_obj(employee)
        if employee.photo_key and file_:
            employee.photo_key.delete_async()
            employee.photo_key = file_.get_result()
        employee.put_async()
        return redirect(url_for('about.admins.employee'))
    else:
        if blob_info:
            blob_info.delete()

    edit_url = blobstore.create_upload_url(url_for('about.admins.employee_update', key_id=key_id))
    return render_template(
        'about/admins/employee/edit.html',
        employee=employee,
        form=form,
        edit_url=edit_url)
示例#17
0
文件: views.py 项目: gmist/solostyle
def tenancy_edit(key_id):
    tenancy = Tenancy.retrieve_by_id(key_id)
    if not tenancy:
        return redirect(url_for('tenancy.admin.tenancy'))
    if request.method == 'POST' and 'delete_tenancy' in request.form:
        tenancy.key.delete()
        return redirect(url_for('tenancy.admin.tenancy'))
    url = blobstore.create_upload_url(
        url_for('tenancy.admin.edit', key_id=key_id)
    )
    form = TenancyForm(obj=tenancy)
    if request.method == 'POST':
        upload_files = get_uploads(request, 'attach_file')
        file_ = None
        if len(upload_files):
            blob_info = upload_files[0]
        else:
            blob_info = None

        if form.validate_on_submit():
            if blob_info:
                blob_info = blobstore.BlobInfo.get(blob_info.key())
                if blob_info.size:
                    file_ = File.create(
                        blob_key=blob_info.key(),
                        title=form.name.data,
                        description=form.description.data,
                        is_public=form.is_public.data,
                        filename=os.path.basename(blob_info.filename.replace('\\', '/')),
                        size=blob_info.size,
                        content_type=blob_info.content_type)
                    file_.put()
                else:
                    blob_info.delete()

        form.populate_obj(tenancy)
        if file_:
            if tenancy.file:
                tenancy.file.delete()
            tenancy.file = file_.key
        tenancy.put()
        return redirect(url_for('tenancy.admin.tenancy'))

    return render_template(
        'tenancy/admin/tenancy_edit.html',
        tenancy=tenancy,
        form=form,
        url=url
    )
示例#18
0
def edit_newsletter(request, key):
    newsletter = Newsletter.get(key)
    form = AddNewsletter(instance=newsletter)
    if request.method == "POST" and request.form and form.validate(request.form, request.files):
        newsletter = form.save(commit=False)
        newsletter.put()
        return redirect("/admin/postman/newsletters/")
    files = []
    for file_key in newsletter.n_price_list:
        file_ = File.get(file_key)
        if file_:
            files.append(file_)
    return render_to_response(
        "postman/admin/newsletters/edit.html", {"form": form.as_widget(), "key": key, "files": files}
    )
示例#19
0
文件: admins.py 项目: gmist/1businka
def index(request):
    url = blobstore.create_upload_url(url_for('price_list/admin'))
    form = PriceListForm(action=url)
    form.csrf_protected = False
    if request.method == 'POST' and form.validate(request.form):
        desc = form['description']
        upload_files = get_uploads(request, 'file')
        if len(upload_files):
            blob_info = upload_files[0]
            if blob_info.size:
                file = File(blob=blob_info.key())
                file.name = file.get_name
                file.put()

                price_list = PriceList(file=file.key, description=desc)
                price_list.put()
            else:
                blob_info.delete()

        return redirect(url_for('price_list/admin'))
    prices = PriceList.query()
    return render_to_response('price_list/admins/index.html',
                                {'form': form.as_widget(),
                                'prices': prices})
示例#20
0
def edit_newsletter2(request, key_id):
    newsletter = Newsletter2.get_by_id(key_id)
    form = AddNewsletter2(instance=newsletter)
    form.managers.choices = get_managers()
    if request.method == "POST" and form.validate(request.form):
        newsletter = form.save(commit=False)
        newsletter.put()
        return redirect(url_for("postman/admin/newsletters2"))
    files = []
    for file_key in newsletter.n_price_list:
        file_ = File.get(file_key)
        if file_:
            files.append(file_)
    return render_to_response(
        "postman/admin/newsletters2/edit.html", {"form": form.as_widget(), "key_id": key_id, "files": files}
    )
示例#21
0
def send_newsletter_task(request, user_key, newsletter_key):
    newsletter = Newsletter.get(newsletter_key)
    managers = []
    message = mail.EmailMessage(sender=settings.DEFAULT_MAIL_FROM, subject=newsletter.title)
    user = UserProfile.get(user_key)
    message.to = user.email
    if not message.to:
        return Response("Ok")

    gifts = []
    gifts_images = {}
    if newsletter.gifts:
        gifts_split = newsletter.gifts.split(",")
        for gift in gifts_split:
            try:
                gift = gift.strip()
                obj = Gift.all().filter("uid =", gift).get()
                if obj:
                    gifts.append(obj)
                    if obj.main_thumb:
                        try:
                            img = ThumbImage.get(obj.main_thumb)
                            img = Image.get(img.thumb_200x200)
                            if img:
                                gifts_images[obj.uid] = base64.b64encode(str(img.image))
                        except Exception:
                            pass
            except Exception:
                pass

    message_text = render_to_string(
        "postman/send_newsletter.html",
        {"newsletter": newsletter, "gifts": gifts, "managers": managers, "gifts_images": gifts_images},
    )
    message.html = message_text
    attachments = []
    for file_key in newsletter.n_price_list:
        file_ = File.get(file_key)
        if file_ and file_.blob_key:
            bi = blobstore.BlobInfo.get(file_.blob_key)
            if bi:
                attachments.append(("%s" % file_.title_filename, bi.open().read()))
    message.attachments = attachments
    message.send()
    return Response("OK")
示例#22
0
文件: views.py 项目: gmist/solostyle
def edit_investment(key_id):
    investment = Investment.retrieve_by_id(key_id)
    if not investment:
        return redirect(url_for('investment.admin.index'))
    if request.method == 'POST' and 'delete_investment' in request.form:
        investment.key.delete()
        return redirect(url_for('investment.admin.index'))
    url = blobstore.create_upload_url(
            url_for('investment.admin.edit', key_id=key_id))
    form = InvestmentForm(obj=investment)
    if request.method == 'POST':
        upload_files = get_uploads(request, 'attach_file')
        file_ = None
        if len(upload_files):
            blob_info = upload_files[0]
        else:
            blob_info = None

        if form.validate_on_submit():
            if blob_info:
                blob_info = blobstore.BlobInfo.get(blob_info.key())
                if blob_info.size:
                    file_ = File.create(
                        blob_key=blob_info.key(),
                        filename=os.path.basename(blob_info.filename.replace('\\', '/')),
                        size=blob_info.size,
                        content_type=blob_info.content_type)
                    file_.put()
                else:
                    blob_info.delete()

            form.populate_obj(investment)
            if file_:
                if investment.file:
                    investment.file.delete()
                investment.file = file_.key
            investment.put()
            return redirect(url_for('investment.admin.index'))
    return render_template(
        'investment/admin/edit.html',
        form=form,
        url=url,
        investment=investment
    )
示例#23
0
文件: views.py 项目: gmist/solostyle
def tenancy_add():
    form = TenancyForm()
    url = blobstore.create_upload_url(
        url_for('tenancy.admin.add')
    )
    if request.method == 'POST':
        upload_files = get_uploads(request, 'attach_file')
        file_ = None
        if len(upload_files):
            blob_info = upload_files[0]
        else:
            blob_info = None

        if form.validate_on_submit():
            if blob_info:
                blob_info = blobstore.BlobInfo.get(blob_info.key())
                if blob_info.size:
                    file_ = File.create(
                        blob_key=blob_info.key(),
                        title=form.name.data,
                        description=form.description.data,
                        is_public=form.is_public.data,
                        filename=os.path.basename(blob_info.filename.replace('\\', '/')),
                        size=blob_info.size,
                        content_type=blob_info.content_type)
                    file_.put()
                else:
                    blob_info.delete()

        tenancy = Tenancy()
        form.populate_obj(tenancy)
        if file_:
            tenancy.file = file_.key
        tenancy.put()
        return redirect(url_for('tenancy.admin.tenancy'))

    tenancies = Tenancy.query()
    return render_template(
        'tenancy/admin/add.html',
        add_active='active',
        form=form,
        tenancies=tenancies,
        url=url
    )
示例#24
0
def add_file(key_id):
    folder = Folder.retrieve_by_id(key_id)
    if not folder:
        return flask.redirect(flask.url_for('admin.file.index'))
    upload_files = get_uploads(flask.request, 'file')
    if len(upload_files):
        blob_info = upload_files[0]
        if blob_info.size:
            file = File.create(
                blob_info.key(),
                size=blob_info.size,
                filename=os.path.basename(blob_info.filename.replace('\\','/')),
                content_type=blob_info.content_type)
            file.put()
            if file.get_cached_url():
                folder.files.append(file.key)
                folder.put()
        else:
            blob_info.delete()
    return flask.redirect(flask.url_for('admin.file.edit_folder', key_id=key_id))
示例#25
0
文件: views.py 项目: gmist/solostyle
def add_investment():
    form = InvestmentForm()
    url = blobstore.create_upload_url(
        url_for('investment.admin.add'))
    if request.method == 'POST':
        upload_files = get_uploads(request, 'attach_file')
        file_ = None
        if len(upload_files):
            blob_info = upload_files[0]
        else:
            blob_info = None

        if form.validate_on_submit():
            if blob_info:
                blob_info = blobstore.BlobInfo.get(blob_info.key())
                if blob_info.size:
                    file_ = File.create(
                        blob_key=blob_info.key(),
                        title=form.name.data,
                        description=form.description.data,
                        is_public=form.is_public.data,
                        filename=os.path.basename(blob_info.filename.replace('\\', '/')),
                        size=blob_info.size,
                        content_type=blob_info.content_type)
                    file_.put()
                else:
                    blob_info.delete()

            investment = Investment()
            form.populate_obj(investment)
            if file_:
                investment.file = file_.key
            investment.put()
            return redirect(url_for('investment.admin.index'))
    return render_template(
        'investment/admin/add.html',
        form=form,
        url=url
    )
示例#26
0
def preview2(request, key_id):
    newsletter = Newsletter2.get_by_id(key_id)
    gifts = []
    if newsletter.gifts:
        gifts_split = newsletter.gifts.split(",")
        for gift in gifts_split:
            try:
                gift = gift.strip()
                obj = Gift.all().filter("uid =", gift).get()
                if obj:
                    gifts.append(obj)
            except Exception:
                pass

    managers = []
    for mgr_id in newsletter.managers:
        mgr = Manager.get_by_id(mgr_id)
        if mgr:
            managers.append(mgr)

    emails = newsletter.emails

    files = []
    for file_key in newsletter.n_price_list:
        file_ = File.get(file_key)
        if file_:
            files.append(file_)
    return render_to_response(
        "postman/admin/newsletters2/preview.html",
        {
            "newsletter": newsletter,
            "gifts": gifts,
            "key_id": key_id,
            "files": files,
            "managers": managers,
            "emails": emails,
        },
    )
示例#27
0
文件: views.py 项目: gmist/solostyle
def admin_files_upload():
    form = AboutFileForm()
    if form.validate_on_submit():
        upload_files = get_uploads(request, 'file')
        if len(upload_files):
            blob_info = upload_files[0]
            blob_info = blobstore.BlobInfo.get(blob_info.key())
            if blob_info.size:
                file_ = File.create(
                    blob_key=blob_info.key(),
                    title=form.title.data,
                    description=form.description.data,
                    is_public=form.is_public.data,
                    # wtf? for fix unicode filenames
                    filename=os.path.basename(blob_info.filename.replace('\\','/')),
                    size=blob_info.size,
                    content_type=blob_info.content_type)
                file_.put()
                about_file = AboutFile(file_key=file_.key)
                about_file.put()
            else:
                blob_info.delete()
    return redirect(url_for('about.admin_files'))
示例#28
0
 def delete(self, **kwargs):
     for file_key in self.n_price_list:
         f = File.get(file_key)
         if f:
             f.delete()
     super(Newsletter, self).delete(**kwargs)
示例#29
0
def send_newsletter_task2(request, email, newsletter_key_id):
    newsletter = Newsletter2.get_by_id(newsletter_key_id)

    managers = []
    for mgr_id in newsletter.managers:
        mgr = Manager.get_by_id(mgr_id)
        if mgr:
            managers.append(mgr)

    message = mail.EmailMessage(sender=settings.DEFAULT_MAIL_FROM, subject=newsletter.title)
    message.to = email
    if not message.to:
        return Response("Ok")
    mangers_emails = [manager.email for manager in managers]
    if mangers_emails:
        message.reply_to = ",".join(mangers_emails)

    gifts = []
    gifts_images = {}
    if newsletter.gifts:
        gifts_split = newsletter.gifts.split(",")
        for gift in gifts_split:
            try:
                gift = gift.strip()
                obj = Gift.all().filter("uid =", gift).get()
                if obj:
                    gifts.append(obj)
                    if obj.main_thumb:
                        try:
                            img = ThumbImage.get(obj.main_thumb)
                            img = Image.get(img.thumb_200x200)
                            if img:
                                gifts_images[obj.uid] = base64.b64encode(str(img.image))
                        except Exception:
                            pass
            except Exception:
                pass

    message_text = render_to_string(
        "postman/send_newsletter2.html",
        {"newsletter": newsletter, "gifts": gifts, "managers": managers, "gifts_images": gifts_images},
    )
    message.html = message_text
    attachments = []
    for file_key in newsletter.n_price_list:
        file_ = File.get(file_key)
        if file_ and file_.blob_key:
            bi = blobstore.BlobInfo.get(file_.blob_key)
            if bi:
                attachments.append(("%s" % file_.title_filename, bi.open().read()))
    if attachments:
        message.attachments = attachments
    try:
        message.send()
    except apiproxy_errors.OverQuotaError:

        def txn():
            taskqueue.add(
                url=url_for("postman/send_newsletter_task2", email=email, newsletter_key_id=newsletter_key_id),
                transactional=True,
            )

        db.run_in_transaction(txn)
    return Response("OK")